将雄辩的HasMany关系转换为HasOne?

时间:2019-09-05 13:48:59

标签: eloquent relationship has-many has-one

好,我有链接到许多模型A的模型B,因此模型A与模型hasMany和模型{ {1}}与模型BB关系。

但是,在所有这些belongsTo中,有一个特定的,例如值较高的那个,我希望模型A与它有专门的关系。

我知道我可以在模型B中创建第二个关系,该关系可以重复使用旧的关系,并添加我想要的所有范围和条件,但是由于我是根据{{1} },它将始终返回结果集合。

有没有办法让它返回单个结果而不是集合?我知道我可以添加一个A,但这涉及将这种新关系用作函数,即始终带有括号,并且如果可能的话,我仍然想雄辩地使用它。

有可能这样做吗?如果是,怎么办?

2 个答案:

答案 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(...);
}