2013-12-20 101 views
2

我有兩個型號:Laravel Eloquent設置模型關係的默認值?

class Product extends Eloquent { 

    ... 

    public function defaultPhoto() 
    { 
     return $this->belongsTo('Photo'); 
    } 

    public function photos() 
    { 
     return $this->hasMany('Photo'); 
    } 
} 

class Photo extends Eloquent { 

    ... 

    public function getThumbAttribute() { 
     return 'products/' . $this->uri . '/thumb.jpg'; 
    } 

    public function getFullAttribute() { 
     return 'products/' . $this->uri . '/full.jpg'; 
    } 

    ... 

} 

這工作得很好,我可以打電話$product->defaultPhoto->thumb$product->defaultPhoto->full,並獲得了相關圖像的路徑,並獲得使用$product->photos,並通過循環值的所有照片。

問題出現在產品沒有照片時,我似乎無法找到一種方法來爲這種情況設置默認值。

我試圖做的事情,如

public function photos() 
{ 
    $photos = $this->hasMany('Photo'); 
    if ($photos->count() === 0) { 
     $p = new Photo; 
     $p->url = 'default'; 
     $photos->add($p); 
    } 

    return $photos; 
} 

我也創建了一個全新Collection存儲在新Photo模型,但他們都返回相同的錯誤:

Call to undefined method Illuminate\Database\Eloquent\Collection::getResults() 

有任何人做過類似的事情?

在此先感謝!

+0

我不會把這種行爲放在模型中。我會簡單地在控制器/視圖中使用if($ product-> photo === null){執行某些操作}。 – Dave

+0

如果您想要爲這些項目應用默認值,那麼在數據庫級別做更好嗎?這將允許一致處理NULL情況。 –

+0

我採取了在視圖中執行以下操作:'{{$ product-> defaultPhoto? $ product-> defaultPhoto-> thumb:'/img/default-product.png'}}' –

回答

5

您可以在爲您做檢查的產品模型上創建一個訪問器。工作,如果你只是想將其定義爲一種方法,也是相同的(好如果你要抽象一些雄辯的電話,使用界面爲你的產品的情況下,你以後改變它,等)

/** 
* Create a custom thumbnail "column" accessor to retrieve this product's 
* photo, or a default if it does not have one. 
* 
* @return string 
*/ 
public function getThumbnailAttribute() 
{ 
    $default = $this->defaultPhoto; 

    return (! is_null($default)) 
     ? $default->thumb 
     : '/products/default/thumb.jpg'; 
} 

你可能也想看看Presenters。在某些情況下有點矯枉過正,但卻非常方便(並且將這樣的東西從你的模型中抽象出來)。

+0

This!答案在我的問題中(我已經在照片模型中使用過訪問器!) –