为了账号安全,请及时绑定邮箱和手机立即绑定

在 Laravel 中,当 orderBy() 处理关系时如何组合 where() 和

在 Laravel 中,当 orderBy() 处理关系时如何组合 where() 和

PHP
茅侃侃 2022-01-02 15:33:49
我有两个模型,一个Track模型和一个Artist模型,每个Track模型belongsTo()一个Artist模型。Track模型有一个number列,Artist模型有一个name列。我想检索所有Tracks位置number = 1,然后显示按艺术家姓名排序的那些。到目前为止,我只知道如何做一个或另一个,而不是两者。我希望能够通过以下方式做到这一点:Track::with(['artist' => function($q) {            $q->orderBy('name');        }])->where('number', 1)->get();这将显示所有曲目,其中number = 1,但tracks未按任何特定顺序排序。如果我with()完全删除它,我会得到相同的结果。相反,如果我删除该where()子句,那么我将获得数据库中的所有曲目,并按艺术家的姓名对它们进行排序。如何结合这两个功能?
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

使用这样的东西:

Track::with('artist')->join('artist', 'artist.id', '=', 'track.artist_id')->orderBy('artist.name', 'DESC')->get()

我希望你明白我的意思


查看完整回答
反对 回复 2022-01-02
?
跃然一笑

TA贡献1826条经验 获得超6个赞

你不能用你的代码按艺术家的名字排序,因为 laravel,对于eager load有曲目的艺术家,执行两个查询,你应该使用 ajoin来进行一个查询,但我给出了另外两个选项(我不喜欢 joins):


1)您可以在结果集合上使用sortBy()或sortByDesc()(如果要降序排序),例如:


$tracks = Track::with('artist')->where('number', 1)->get()->sortBy('artist.name');

2) 您可以从 Artist 开始查询,但您必须稍微更改一下您的视图,例如:


$artists = Artist::with(['tracks' => function($q) {

               $q->where('number', 1);

           }])->orderBy('name')->get();

3)您可以使用连接,请参阅另一个答案。


仅供参考,如果您想调试查询,只需追加->toSql()代替->get()以获取您的SQL.


查看完整回答
反对 回复 2022-01-02
  • 2 回答
  • 0 关注
  • 213 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信