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

我有两个模型,一个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()子句,那么我将获得数据库中的所有曲目,并按艺术家的姓名对它们进行排序。如何结合这两个功能?


茅侃侃
浏览 217回答 2
2回答

吃鸡游戏

使用这样的东西:Track::with('artist')->join('artist', 'artist.id', '=', 'track.artist_id')->orderBy('artist.name', 'DESC')->get()我希望你明白我的意思

跃然一笑

你不能用你的代码按艺术家的名字排序,因为 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.
打开App,查看更多内容
随时随地看视频慕课网APP