我有3张桌子,汽车,公寓和商店。每张桌子都有照片。照片存储在数据库中。我想只使用一张桌子拍照,我不想为每辆汽车,公寓和商店创建照片表。
照片表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模型类中定义hasMany与类型的关系。
这样做的正确方法是什么?
答案 0 :(得分:63)
您可以将关系对象视为类似查询,因为您可以使用它们调用查询构建函数。下面的例子可以让你朝着正确的方向前进。
class Cars extends Eloquent
{
function photos()
{
return $this->hasMany('Photo')->where('photos.type', '=', 'Cars');
}
}
答案 1 :(得分:15)
您可以使用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;
为此,您还需要在photos
表中添加2个其他列:
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)