2014-04-11 22 views
7

Czy można przekazać, w jakiś sposób, parametr do funkcji relacji?Laravel: Przekaż parametr do funkcji relacji?

Mam obecnie następujące:

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

Problem polega na tym, że w niektórych przypadkach nie sprowadzić kolumnę unlocked_at i zwraca błąd.

Próbowałem zrobić coś takiego:

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

i nazwać jak:

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

Ale to nie działa. Czy istnieje sposób przekazania parametrów do tej funkcji lub w inny sposób sprawdzenia, czy używany jest kod pivot_unlocked_at?

+4

Powinieneś być w porządku, aby robić to, co mówisz. Należy jednak pamiętać, że funkcje relacji działają inaczej, jeśli wywołasz je jako metodę nad właściwościami. Jeśli użyjesz ich jako właściwości, otrzymasz zestaw wyników (kolekcja), ale jeśli wywołasz je jako metody, otrzymasz narzędzie do tworzenia zapytań. Jeśli chcesz przekazać im parametry, oczywiście musisz wywoływać je jako metody, więc upewnij się, że wykonujesz '-> get()' w swoim kodzie wywołującym: '$ member-> achievementments (true) -> get() -> (...) "byłoby równoznaczne z' $ member-> achievementments -> (...) '. – alexrussell

+0

awsm @alexrussell. uratował mi ból głowy .... –

+0

Cieszę się, że moja rada z 2014 roku jest nadal aktualna :) – alexrussell

Odpowiedz

3

Cóż, po prostu dodałem nowy atrybut do mojego modelu, a następnie dodałem mój warunek do tego atrybutu, po prostu to zrobiłem.

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.... 
    } 
} 
Powiązane problemy