【问题标题】:Laravel: sort query results based on field of nested relationshipLaravel:根据嵌套关系的字段对查询结果进行排序
【发布时间】: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' 顺序的结果也保持不变。

【问题讨论】:

    标签: laravel eloquent laravel-query-builder laravel-nova eloquent-relationship


    【解决方案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 与定义的关系一起使用,我认为这是正确的方法。否则,我们都可以使用查询生成器。没什么大不了的。谢谢,快乐编码:)
    猜你喜欢
    • 2018-03-06
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多