2014-10-17 105 views
17

我有3張桌子,汽車,公寓和商店。每張桌子都有它的照片。照片存儲在數據庫中。我只想使用一張桌子照片,我不想爲每個汽車,公寓和商店創建照片列表。Laravel hasMany with Where

照片表structe是這樣的;

| id |   photo_url  | type | destination_id | 
------------------------------------------------------------ 
    1 | http://example.com/1.jpg | Cars |  1   | 
    2 | http://example.com/2.jpg | Flats |  1   | 
    3 | http://example.com/3.jpg | Flats |  2   | 
    4 | http://example.com/4.jpg | Shops |  1   | 
    5 | http://example.com/3.jpg | Shops |  2   | 

我需要在Shops,Flats和Cars模型類中定義與類型的許多關係。

這樣做的正確方法是什麼?

回答

13

您可以使用Eloquent的Polymorphic relationships。 Laravel文檔中的示例實際上展示了爲多個模型設置一個通用圖像表,以便您指出正確的方向。在你萬一你的模型會是這個樣子:

class Photo extends Eloquent { 

    public function imageable() 
    { 
     return $this->morphTo(); 
    } 

} 

class Car extends Eloquent { 

    public function photos() 
    { 
     return $this->morphMany('Photo', 'imageable'); 
    } 

} 

class Flat extends Eloquent { 

    public function photos() 
    { 
     return $this->morphMany('Photo', 'imageable'); 
    } 

} 

class Shop extends Eloquent { 

    public function photos() 
    { 
     return $this->morphMany('Photo', 'imageable'); 
    } 

} 

而且你可以訪問照片,比方說,一個給定的Flat,像這樣:

Flat::find($id)->photos; 

對於這個工作,你會還需要2個額外的列添加到您的photos表:

imageable_id: integer <-- This will be the ID of the model 
imageable_type: string <-- This will be the model's class name (Car/Flat/Shop) 
+2

Spasibo bratan! – fobus 2014-10-17 22:24:22

40

您可以使用類似於查詢的關係對象類型,因爲您可以使用它們調用查詢構建函數。下面的例子應該讓你朝着正確的方向前進。

class Cars extends Eloquent 
{ 
    function photos() 
    { 
     return $this->hasMany('Photo')->where('photos.type', '=', 'Cars'); 
    } 
} 
+0

非常感謝,我需要調用'令::與( '的OrderItems') - >在哪裏( 'orderItems.type',1) - >與('orderItems.o rderItemOptions','orderItems.orderMenuItems') - > first()',並且作用域不會那樣工作 – cnlevy 2015-11-05 21:20:30