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();
这些是公司订单。你也可以用这个。
我有两个模型,其关系定义如下
订单
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();
这些是公司订单。你也可以用这个。