Laravel:根据嵌套关系的字段对查询结果进行排序
Posted
技术标签:
【中文标题】Laravel:根据嵌套关系的字段对查询结果进行排序【英文标题】:Laravel: sort query results based on field of nested relationship 【发布时间】:2021-11-17 15:54:11 【问题描述】:我有两个模型,其关系定义如下
订购
public function owner()
return $this->belongsTo(User::class, 'owner_id');
用户
public function company()
return $this->belongsTo(Company::class, 'company_id');
公司表有“标题”字段。 我想要的是按公司名称对所有订单进行排序/排序。我尝试了不同的解决方案,但似乎没有任何效果。任何帮助或提示将不胜感激。
我最近尝试的解决方案是
$query = OrderModel::whereHas('owner', function($q) use ($request)
// $q->orderBy('owner');
$q->whereHas('company',function ($q2) use ($request)
$q2->orderBy('title',$request->get('orderByDirection') ?? 'asc');
);
);
但我没有在查询结果中获得用户和公司的关系。 'ASC' 和 'DESC' 顺序的结果也保持不变。
【问题讨论】:
【参考方案1】:您可以在添加join
后对查询进行排序:
return Order::join('users', 'users.id', '=', 'owner_id')
->join('companies', 'companies.id', '=', 'users.company_id')
->orderBy('companies.title')
->select('orders.*')
->get();
【讨论】:
非常感谢。就我而言,左联接更好,因为即使没有与之关联的公司,我也想要所有订单。【参考方案2】:您可以在用户和公司模型中定义新关系。
用户
public function orders()
return $this->hasMany(Order::class);
公司
public function users()
return $this->hasMany(User::class);
现在您可以获取位于asc
订单中的公司,并且使用关系,您可以获取用户和订单。所以ORM就像是,
$companies = Company::with('users.orders')->orderBy('title', 'ASC')->get();
所以这些是公司方面的订单。你也可以用这个。
【讨论】:
感谢您的努力,但这不是我需要的。我想按公司订购,但上面的查询返回公司 是的,上面的查询返回公司以及用户的订单。我只是将 ORM 与定义的关系一起使用,我认为这是正确的方法。否则,我们都可以使用查询生成器。没什么大不了的。谢谢,快乐编码:)以上是关于Laravel:根据嵌套关系的字段对查询结果进行排序的主要内容,如果未能解决你的问题,请参考以下文章
我需要知道用于查询嵌套关系并返回结果的 Laravel Eloquent 语法
Laravel Lighthouse - 按关系的属性对查询进行排序