Laravel / Eloquent - 自定义关系方法

时间:2015-05-18 13:35:23

标签: laravel eloquent relation belongs-to

我有一个类Report,它与Metric有belongsToMany关系。报告还具有与度量标准的belongsTo关系。

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

因此,从基本的角度来说 - 有没有办法让一个关系首先检查另一个关系,看看是否已经加载了一个模型,如果是,则指向该对象而不是创建一个新对象。

我尝试在Metric的belongsTo关系方法中加入一些代码,但我无法回答需要返回belongsTo实例的事实,这需要将各种事物作为构造函数参数传递(即查询对象),在这种情况下,模型已经在belongsToMany关系中加载。

我想放弃belongsTo关系并在数据透视表中为belongsToMany关系水平添加数据,但它不是一个多对多关系,所以看起来有点不对。

谢谢!

杰夫

1 个答案:

答案 0 :(得分:1)

这里的想法是编写一个函数来检查是否加载了关系并返回该关系,否则它将返回belongsToMany。这将在你的Report课程中进行。这也适用于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,我建议在您的数据透视表中为这两个ID添加一个唯一的密钥,以避免在数据透视表中获得任何重复项