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 - 按关系的属性对查询进行排序

Laravel 查询生成器。返回嵌套结构化数据

刀片模板中的多对多关系中的 Laravel 嵌套查询

Java学习总结(十六)——MySQL数据库(中)分组,嵌套,连接查询及外键与关系表设计

SQL语句对返回的结果集里的字段再进行条件查询,在一个结果集显示