Laravel: 根据嵌套关系的字段对查询结果进行排序

Laravel: sort query results based on field of nested relationship

我有两个模型,其关系定义如下

订单

public function owner()
{
    return $this->belongsTo(User::class, 'owner_id');
}

用户

public function company(){
    return $this->belongsTo(Company::class, 'company_id');
}

公司 table 有 'title' 字段。 我想要的是按公司名称获取所有订单 sorted/order。我尝试了不同的解决方案,但似乎没有任何效果。任何帮助或提示将不胜感激。

我最近尝试的解决方案是

$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' 顺序的结果也相同。

您可以在添加 join 后对查询进行排序,例如:

return Order::join('users', 'users.id', '=', 'owner_id')
        ->join('companies', 'companies.id', '=', 'users.company_id')
        ->orderBy('companies.title')
        ->select('orders.*')
        ->get();

您可以在用户和公司模型中定义新关系。

用户

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();

这些是公司订单。你也可以用这个。