【问题标题】:Extra information table joined without eloquent model没有 eloquent 模型加入的额外信息表
【发布时间】:2013-08-31 10:09:42
【问题描述】:

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

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

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

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

【问题讨论】:

标签: laravel laravel-4 eloquent


【解决方案1】:

您可以使用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;

Item 模型上的 extrainfo 关系将返回 ScoreSubItem 实例,具体取决于拥有照片的模型类型。该类型是在数据库表上定义的。

注意:这并不过分,您可以将其视为提供的元信息,用于告诉 Eloquent 如何处理您的关系。

【讨论】:

    猜你喜欢
    • 2020-11-02
    • 2015-09-11
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多