Laravel / Eloquent - 自定义关系方法

Laravel / Eloquent - custom relation method

我有一个 class 报告,它与 Metric 有 belongsToMany 关系。 Report 还额外具有与 Metric 的 belongsTo 关系。

通常,由 belongsTo 关系编辑的模型 return 与 belongsToMany 关系中的模型之一相同。当这是真的时,我希望这两个关系中的每一个实际上都在查看同一个对象实例(这也节省了对数据库的额外访问)。

所以,从根本上讲 - 有没有一种方法可以让一个关系先检查另一个关系,看看是否已经加载了一个模型,如果已经加载,则指向该对象而不是创建一个新对象。

我尝试在 Metric 的 belongsTo 关系方法中放置一些代码,但我无法回避它需要 return belongsTo 实例的事实,它需要作为构造函数参数传递的各种东西(即。一个查询对象),在模型已经加载到 belongsToMany 关系中的情况下不相关。

我想放弃 belongsTo 关系并在 pivot table 中为 belongsToMany 关系水平添加数据,但这不是所需的多对多关系,所以这似乎有点不对。

谢谢!

杰夫

这里的想法是编写一个函数来检查关系是否已加载以及 return 该关系,否则它将 return belongsToMany。这将进入您的 Report class。这也适用于 Laravel 5。如果您有 4 个,只需从模型名称中删除命名空间。

public function metric()
{
    return $this->belongsTo('App\Metric');
}

public function metrics()
{
    return $this->belongsToMany('App\Metric');
}

public function getMetric()
{
    if(array_key_exists('metric', $this->getRelations())) {
        return $this->metric;
    }

    return $this->metrics()->first();
}

如果您确实决定只使用 belongsToMany,我建议您在数据透视表 table 上放置一个唯一键,以防止两个 ID 在数据透视表中出现任何重复项 table.