2016-06-08 115 views
7

我有一個產品型號Laravel如何在Eloquent模型中添加自定義函數?

class Product extends Model 
{ 
    ... 

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

    ... 
} 

我想補充這將返回的最低價格的功能,並在控制器我可以用獲取的價值:我加入這產品型號

Product::find(1)->lowest; 

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

但我得到了一個錯誤說:

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

如果我使用Product::find(1)->lowest();,它會工作。是否有可能獲得Product::find(1)->lowest;的工作?

任何幫助,將不勝感激。

+0

沒有OFC因爲你調用一個方法,我認爲TGAT只會工作一個hasone關係,有什麼區別?有還是沒有! –

回答

19

當您嘗試訪問模型中的某個函數作爲變量時,laravel會假設您嘗試檢索相關模型。他們稱之爲動態屬性。你需要的是一個自定義屬性。

添加下面的方法模型:

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

現在,你應該能夠訪問它像這樣:

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

我沒有意識到你可以使用未在基礎表中定義爲列的屬性來完成此操作;該文件沒有提到(我可以找到)。 –

+0

您好,我也有興趣知道您在Laravel文檔中可以找到的位置。謝謝。 – sanders

+0

我認爲這需要最低(); - 我得到一個關係錯誤沒有結束'()' – caro

1

爲什麼你只是不這樣做呢?我知道,這不是你特別要求的,有時這可能是一種不好的做法。但在你的情況下,我想這很好。

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

他明確要求在模型中的功能。 –

+0

我知道,我只是給了他第二個aproache。 –

8

使用雄辯accessors

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

然後

$product->lowest; 
相關問題