2016-06-08 36 views
7

Ho un modello prodottoLaravel come aggiungere una funzione personalizzata in un modello Eloquent?

class Product extends Model 
{ 
    ... 

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

    ... 
} 

voglio aggiungere una funzione che restituirà il prezzo più basso, e controller posso ottenere il valore utilizzando:

Product::find(1)->lowest; 

ho aggiunto questo modello di prodotto :

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

ma ho ottenuto un errore che dice:

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

E se uso Product::find(1)->lowest();, funzionerà. È possibile ottenere Product::find(1)->lowest; per funzionare?

Qualsiasi aiuto sarebbe apprezzato.

+0

non OFC poiché si sta chiamando un metodo penso tgat funziona solo per un rapporto hasone, e qual è la differenza? con o senza! –

risposta

19

Quando si tenta di accedere a una funzione nel modello come variabile, laravel presuppone che si stia tentando di recuperare un modello correlato. Li chiamano proprietà dinamiche. Quello che ti serve invece è un attributo personalizzato.

add seguente metodo al modello:

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

Ora si dovrebbe essere in grado di accedere in questo modo:

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

Non mi ero reso conto che potevi farlo con attributi che non erano definiti come colonne nella tabella sottostante; la documentazione non ha menzionato questo (che ho potuto trovare). –

+0

Ciao Sarei interessato anche a sapere dove potrei trovarlo nella documentazione di Laravel. Grazie. – sanders

+0

penso che questo deve essere più basso(); - Ottengo un errore di relazione senza che finisca '()' – caro

1

perché basta non fare questo? lo so, non è quello che hai chiesto specificamente e potrebbe essere una cattiva pratica a volte. ma nel tuo caso credo sia buono.

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

Richiede chiaramente una funzione nel modello. –

+0

lo so, gli ho appena dato un secondo aproache. –

8

Usa Eloquente accessors

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

Poi

$product->lowest;