好,我有链接到许多模型A
的模型B
,因此模型A
与模型hasMany
和模型{ {1}}与模型B
有B
关系。
但是,在所有这些belongsTo
中,有一个特定的,例如值较高的那个,我希望模型A
与它有专门的关系。
我知道我可以在模型B
中创建第二个关系,该关系可以重复使用旧的关系,并添加我想要的所有范围和条件,但是由于我是根据{{1} },它将始终返回结果集合。
有没有办法让它返回单个结果而不是集合?我知道我可以添加一个A
,但这涉及将这种新关系用作函数,即始终带有括号,并且如果可能的话,我仍然想雄辩地使用它。
有可能这样做吗?如果是,怎么办?
答案 0 :(得分:4)
如何?
public function Bs()
{
return $this->hasMany(B::class);
}
public function B()
{
$builder = $this->Bs()->latest(); // Add your own conditions etc...
$relation = new HasOne($builder->getQuery(), $this, 'a_id', 'id');
return $relation; // or return $relation->withDefault();
}
答案 1 :(得分:0)
不是真的。您有2个具有某些属性的模型映射表
+-----+-----+
| A | B |
+-----+-----+
| id | id |
| ... | a_id|
| | ... |
+-----+-----+
当您调用hasMany
关系时,构建器将执行查询。像
SELECT * FROM `B` WHERE `B`.`a_id` = ?
如果为其创建其他关系,则将仅重复查询(如果同时加载两个关系)。您可以制作accessor
,也可以只使用first()
。
编辑访问者代码:
# A model
public function getXAttribute()
{
// Query only if necessary
if(!this->relationLoaded('b')) $this->load('b');
// Use Collection methods to filter
return $this->b->firstWhere(...);
}