2016-05-23 15 views
2

Ich habe 2 Modelle, eine ServiceInstances Das gehört zu einem ServiceTypes. Service-Typ bestimmt einige Dinge und unter ihnen den Dienst lengthLaravel Scope basierend auf BelongsTo Beziehung

In ServiceInstances Ich versuche, diese "Pseudo" Logik zu implementieren:

Ich brauche $ this->Servicetype() zu bekommen -> Länge, aber Beziehungsmethode schlägt fehl

public function scopeExpired($query) { 
    $length = $query->serviceType()->length; 
    return $query->where('created_at', '<', Carbon::now()->subDays($length)); 
} 

Irgendwelche Ideen?

+1

vielleicht '$ this-> serviceType-> Länge' - ohne Klammern – Yurich

+0

Versuchte, dass ohne Erfolg - Alles, was ich bekommen, ist ein weiterer Fehler: '[Error] nicht definierte Eigenschaft: October \ Regen \ Database \ Builder :: $ serviceType' –

+1

** Scopes sollten die Abfrage modifizieren, nicht ausführen. ** Sie werden wahrscheinlich einen Join in der Service-Typ-Tabelle machen und den Längenvergleich in SQL statt in PHP durchführen. – jfadich

Antwort

0

Der Aufruf $query->serviceType() gibt das Beziehungsobjekt zurück, während $query->serviceType das Modell (die Modelle) selbst zurückgibt. Momentan ruft es das eine Modell ab, aber wenn Sie eine oneToMany- oder manyToMany-Beziehung haben, gibt es ein Array der Modelle zurück.

Der richtige Weg, um das zu tun, was Sie versuchen, lautet serviceType ohne Klammern, wie folgt.

public function scopeExpired($query) { 
    $length = $query->serviceType->length; 
    return $query->where('created_at', '<', Carbon::now()- >subDays($length)); 
} 
+0

Versucht, dass ohne Erfolg - alles, was ich bekomme, ist ein weiterer Fehler: '[ErrorException] Nicht definierte Eigenschaft: Oktober \ Rain \ Database \ Builder :: $ serviceType' –

1

Sie sollten keine Abfragen innerhalb eines Bereichs ausführen. Sie können dasselbe mit reinem SQL erreichen. Probieren Sie es aus.

public function scopeExpired($query) { 
    return $query 
     ->join('services', 'services.type_id', '=', 'service_types.id') 
     ->whereRaw('TO_DAYS(created_at) < DATE_SUB(NOW()) - service_types.length'); 
} 
Verwandte Themen