额外的信息表加入没有雄辩的模型

时间:2013-08-31 10:09:42

标签: laravel laravel-4 eloquent

假设我有一个名为Item的数据库表(带有名称和类型)。现在,根据类型,该项目有额外的信息:例如如果它是ScoredItem,它有一个分数。所以我创建了一个数据库表ItemScore,它为一个项目分配一个分数。

然后我有一个雄辩的模型:Item(带有名称和类型),但是我应该如何添加这个Score属性。

一个明显的解决方案是创建一个模型:ItemScore并设置正确的关系(使用hasMany和belongsTo)。但因为它只包含一个分数,这似乎有点矫枉过正。

所以问题是:是否可以以某种方式指定这种关系,以便我可以请求项目的分数(如果有的话)并设置它以便正确保存在数据库中,而不创建此模型类?

1 个答案:

答案 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关系将返回ScoreSubItem实例,具体取决于拥有该照片的模型类型。该类型在数据库表中定义。

注意:这不是矫枉过正,您可以看到提供的元信息告诉Eloquent如何对待您的关系。