2014-04-11 24 views
7

Ist es irgendwie möglich, einen Parameter an eine Beziehungsfunktion zu übergeben?Laravel: Parameter an Beziehungsfunktion übergeben?

Im Moment habe ich die folgenden:

public function achievements() 
{ 
    return $this->belongsToMany('Achievable', 'user_achievements')->withPivot('value', 'unlocked_at')->orderBy('pivot_unlocked_at', 'desc'); 
} 

Das Problem ist, dass in einigen Fällen ist es nicht die unlocked_at Spalte holen und es gibt einen Fehler zurück.

Ich habe versucht, wie etwas zu tun:

public function achievements($orderBy = true) 
{ 
$result = $this->belongsToMany (...) 
if($orderBy) return $result->orderBy(...) 
return $result; 
} 

Und nennen Sie es wie:

$member->achievements(false)->(...) 

Aber das funktioniert nicht. Gibt es eine Möglichkeit, Parameter in diese Funktion einzugeben oder zu überprüfen, ob die pivot_unlocked_at verwendet wird?

+4

Sie sollten in Ordnung sein, um zu tun, was Sie sagen. Sie müssen sich jedoch daran erinnern, dass sich die Beziehungsfunktionen anders verhalten, wenn Sie sie als Methode über Eigenschaften aufrufen. Wenn Sie sie als Eigenschaften verwenden, erhalten Sie eine Ergebnismenge (Collection), aber wenn Sie sie als Methoden aufrufen, erhalten Sie einen Abfragegenerator. Wenn Sie Parameter an sie übergeben wollen, müssen Sie sie offensichtlich als Methoden bezeichnen, also stellen Sie sicher, dass Sie in Ihrem aufrufenden Code ein '-> get()' machen: $ Member-> Errungenschaften (true) -> get() -> (...) 'wäre äquivalent zu $ ​​member-> achievements -> (...)'. – alexrussell

+0

awsm @alexrussell. rettete mir Kopfschmerzen ... –

+0

Froh, dass mein Rat von 2014 noch relevant ist :) – alexrussell

Antwort

3

Nun, was ich getan habe, war nur neue Attribute zu meinem Modell hinzufügen und dann fügen Sie meine Bedingung zu dieser Attirbute, einfach dies getan.

Class Foo extends Eloquent { 
    protected $strSlug; 

    public function Relations(){ 
     return $this->belongsTo('Relation','relation_id')->whereSlug($this->strSlug); 
    } 
} 

Class FooController extends BaseController { 
    private $objFoo; 


    public function __construct(Foo $foo){ 
     $this->objFoo = $foo 
    } 

    public function getPage($strSlug){ 
     $this->objFoo->strSlug = $strSlug; 
     $arrData = Foo::with('Relations')->get(); 
     //some other stuff,page render,etc.... 
    } 
} 
Verwandte Themen