将 Eloquent HasMany 关系转换为 HasOne?

fud*_*udo 2 has-many relationship has-one eloquent

好吧,我有模型A链接到许多模型B,让模型A有一个hasMany以模型关系B和模型B有一个belongsTo到模型的关系A

但是,在所有这些中,B有一个特定的,例如具有更高价值的那个,我希望模型A与之建立专门的关系。

我知道我可以在模型A中创建第二个关系,重新使用旧的关系并添加我想要的所有范围和条件,但是由于我正在从 a 构建这个新关系hasMany,它无论如何都会返回一个集合结果。

有没有办法让它返回单个结果而不是集合?我知道我可以添加一个first(),但这涉及将这个新关系用作函数,即始终使用括号,如果可能,我仍希望以雄辩的方式使用它。

有可能这样做吗?如果是,如何?

Mus*_*aya 5

这个怎么样:

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();
}
Run Code Online (Sandbox Code Playgroud)

更新:

Laravel 8.42 提供了一种新的一对多关系。您可能想改用它:

public function B(): HasOne
{
    return $this->hasOne(B::class)->latestOfMany();
}

Run Code Online (Sandbox Code Playgroud)

  • 谢谢@Mustafa,这真的很有趣,下次我会记住它;也许对于更复杂的用例这会有所帮助。 (2认同)