我有一个类Report,它与Metric有belongsToMany关系。报告还具有与度量标准的belongsTo关系。
通常,belongsTo关系返回的模型与belongsToMany关系中的一个模型相同。当这是真的时,我希望这两个关系中的每一个实际上都看同一个对象实例(这也节省了额外的数据库之旅)。
因此,从基本的角度来说 - 有没有办法让一个关系首先检查另一个关系,看看是否已经加载了一个模型,如果是,则指向该对象而不是创建一个新对象。
我尝试在Metric的belongsTo关系方法中加入一些代码,但我无法回答需要返回belongsTo实例的事实,这需要将各种事物作为构造函数参数传递(即查询对象),在这种情况下,模型已经在belongsToMany关系中加载。
我想放弃belongsTo关系并在数据透视表中为belongsToMany关系水平添加数据,但它不是一个多对多关系,所以看起来有点不对。
谢谢!
杰夫
答案 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添加一个唯一的密钥,以避免在数据透视表中获得任何重复项