假设我有一个名为Item的数据库表(带有名称和类型)。现在,根据类型,该项目有额外的信息:例如如果它是ScoredItem,它有一个分数。所以我创建了一个数据库表ItemScore,它为一个项目分配一个分数。
然后我有一个雄辩的模型:Item(带有名称和类型),但是我应该如何添加这个Score属性。
一个明显的解决方案是创建一个模型:ItemScore并设置正确的关系(使用hasMany和belongsTo)。但因为它只包含一个分数,这似乎有点矫枉过正。
所以问题是:是否可以以某种方式指定这种关系,以便我可以请求项目的分数(如果有的话)并设置它以便正确保存在数据库中,而不创建此模型类?
答案 0 :(得分:0)
您可以使用Polymorphic Relations,完成所需的工作,但您需要创建模型以向Eloquent提供有关关系的必要信息。正如您所说,假设您拥有Item
而不是Score
或其他任何内容的额外信息,那么就可以改为使用SubItem
。
您必须定义这些模型,如下所示:
class Item extends Eloquent
{
public function extrainfo()
{
return $this->morphTo();
}
}
class Score extends Eloquent
{
public function items()
{
return $this->morphMany('Item', 'extrainfo');
}
}
class SubItem extends Eloquent
{
public function items()
{
return $this->morphMany('Item', 'extrainfo');
}
}
然后您将拥有如下数据库结构:
items
id - integer
name - string
extrainfo_id - integer
extrainfo_type - string
scores
id - integer
score - decimal
sub_items
id - integer
name - string
这将自动执行您需要的操作。当你这样做时:
$extrainfo = $item->extrainfo;
extrainfo
模型上的Item
关系将返回Score
或SubItem
实例,具体取决于拥有该照片的模型类型。该类型在数据库表中定义。
注意:这不是矫枉过正,您可以看到提供的元信息告诉Eloquent如何对待您的关系。