我有两个模型,一个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()
我希望你明白我的意思
跃然一笑
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.
- 2 回答
- 0 关注
- 213 浏览
添加回答
举报
0/150
提交
取消