2016-06-08 19 views
7

mam model produktuLaravel, jak dodać niestandardową funkcję w modelu wymownym?

class Product extends Model 
{ 
    ... 

    public function prices() 
    { 
     return $this->hasMany('App\Price'); 
    } 

    ... 
} 

chcę dodać funkcję, która będzie zwracać najniższą cenę, a kontroler może uzyskać wartość używając:

Product::find(1)->lowest; 

dodałem to w modelu Produktu :

public function lowest() 
{ 
    return $this->prices->min('price'); 
} 

ale mam błąd mówiąc:

Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation 

A jeśli użyję Product::find(1)->lowest();, to zadziała. Czy można uzyskać Product::find(1)->lowest; do pracy?

Każda pomoc zostanie doceniona.

+0

nie ofc ponieważ jesteś wywołanie metody myślę tgat będzie działać tylko dla relacji hasone i jaka jest różnica? z lub bez! –

Odpowiedz

19

Podczas próby uzyskania dostępu do funkcji w modelu jako zmiennej, laravel zakłada, że ​​próbujesz pobrać pokrewny model. Nazywają je właściwościami dynamicznymi. Zamiast tego potrzebujesz niestandardowego atrybutu.

Dodaj następujący sposób do modelu:

public function getLowestAttribute() 
{ 
    //do whatever you want to do 
    return 'lowest price'; 
} 

Teraz powinieneś być w stanie uzyskać dostęp to tak:

Product::find(1)->lowest; 
+1

Nie wiedziałem, że można to zrobić z atrybutami, które nie zostały zdefiniowane jako kolumny w tabeli podstawowej; Dokumentacja nie wspomniała o tym (że mogłem znaleźć). –

+0

Witaj, chciałbym również wiedzieć, gdzie można znaleźć to w dokumentacji Laravel. Dzięki. – sanders

+0

Myślę, że to musi być najniższy(); - pojawia się błąd relacji bez tego zakończenia "()" – caro

1

dlaczego po prostu nie to zrobić? Wiem, to nie jest to, o co prosiłeś, a czasem może to być zła praktyka. ale w twoim przypadku myślę, że to dobrze.

$product = Product::find(1)->with(['prices' => function ($query) { 
    $query->min('price'); 
}])->get(); 
+0

Wyraźnie prosi o funkcję w modelu. –

+0

Wiem, właśnie dałem mu drugi aproache. –

8

Zastosowanie Eloquent accessors

public function getLowestAttribute() 
{ 
    return $this->prices->min('price'); 
} 

Następnie

$product->lowest;