正在 Laravel 中按 many-to-many 关系模型对 eloquent 模型进行排序
Sorting eloquent model by many-to-many relationship model in Laravel
我正在 Laravel 5.8
上构建一个应用程序,其中我有一个名为 company
、technical_description
、state
、region
的模型。一家公司可以在多个州拥有多个地点,因此公司和 state/region 有 many-to-many
关系。所以我的模型看起来像这样:
class Company extends Model {
use SoftDeletes;
protected $guarded = [];
public function states()
{
return $this->belongsToMany('App\State', 'company_state', 'company_id', 'state_id');
}
public function regions()
{
return $this->belongsToMany('App\Region', 'company_region', 'company_id', 'region_id');
}
public function technicalDescription()
{
return $this->hasOne('App\TechnicalDescription', 'company_id', 'id');
}
}
我现在正在构建一个 data-table
,其中我有 Company Name
、Technical Details
、State
、Region
作为 table headers。我想根据这些关系进行排序,所以我在controller中尝试:
public function companies() {
return CompanyResource::collection(
Company::when($request->name, function ($q) use($request) {
$q->where('name', 'like', '%' . $request->name .'%');
})
->join('company_technical_description', 'companies.id', '=', 'company_technical_description.company_id')
->when($request->sort_by_column, function ($q) use($request) {
$q->orderBy($request->sort_by_column['column'], $request->sort_by_column['order'] );
}, function ($q) use($request){
$q->orderBy('updated_at', 'desc');
})
->paginate();
)
}
所以在这种情况下,如果我想根据技术描述的任何细节进行排序,只需将 company_technical_decription.established_date
推入 $request->sort_by_column['column']
即可。
但是在 state
和 region
的 many-to-many 关系的情况下,我几乎不知道该如何继续。
帮我解决一下。谢谢
我知道如何使用 join
,为我工作的数据表的动态顺序。
您可以尝试这样的操作:
public function companies() {
return CompanyResource::collection(
Company::when($request->name, function ($q) use($request) {
$q->where('name', 'like', '%' . $request->name .'%');
})
->select('companies.*', 's.name as state_name')
->join('company_technical_description', 'companies.id', '=', 'company_technical_description.company_id')
->join('company_state as cs', 'company_state.company_id', '=', 'companies.id')
->join('states as s', 'cs.state_id', '=', 's.id')
->when($request->sort_by_column, function ($q) use($request) {
$q->orderBy($request->sort_by_column['column'], $request->sort_by_column['order'] );
}, function ($q) use($request){
$q->orderBy('updated_at', 'desc');
})
->paginate();
)
}
我没有测试这个解决方案,但它很适合入门。如果您现在将 state_name
作为参数传递给排序,则排序应该有效。但我不确定你的数据库表和列,所以设置你的 join
工作。
我认为这是个好主意。
祝你好运!
我正在 Laravel 5.8
上构建一个应用程序,其中我有一个名为 company
、technical_description
、state
、region
的模型。一家公司可以在多个州拥有多个地点,因此公司和 state/region 有 many-to-many
关系。所以我的模型看起来像这样:
class Company extends Model {
use SoftDeletes;
protected $guarded = [];
public function states()
{
return $this->belongsToMany('App\State', 'company_state', 'company_id', 'state_id');
}
public function regions()
{
return $this->belongsToMany('App\Region', 'company_region', 'company_id', 'region_id');
}
public function technicalDescription()
{
return $this->hasOne('App\TechnicalDescription', 'company_id', 'id');
}
}
我现在正在构建一个 data-table
,其中我有 Company Name
、Technical Details
、State
、Region
作为 table headers。我想根据这些关系进行排序,所以我在controller中尝试:
public function companies() {
return CompanyResource::collection(
Company::when($request->name, function ($q) use($request) {
$q->where('name', 'like', '%' . $request->name .'%');
})
->join('company_technical_description', 'companies.id', '=', 'company_technical_description.company_id')
->when($request->sort_by_column, function ($q) use($request) {
$q->orderBy($request->sort_by_column['column'], $request->sort_by_column['order'] );
}, function ($q) use($request){
$q->orderBy('updated_at', 'desc');
})
->paginate();
)
}
所以在这种情况下,如果我想根据技术描述的任何细节进行排序,只需将 company_technical_decription.established_date
推入 $request->sort_by_column['column']
但是在 state
和 region
的 many-to-many 关系的情况下,我几乎不知道该如何继续。
帮我解决一下。谢谢
我知道如何使用 join
,为我工作的数据表的动态顺序。
您可以尝试这样的操作:
public function companies() {
return CompanyResource::collection(
Company::when($request->name, function ($q) use($request) {
$q->where('name', 'like', '%' . $request->name .'%');
})
->select('companies.*', 's.name as state_name')
->join('company_technical_description', 'companies.id', '=', 'company_technical_description.company_id')
->join('company_state as cs', 'company_state.company_id', '=', 'companies.id')
->join('states as s', 'cs.state_id', '=', 's.id')
->when($request->sort_by_column, function ($q) use($request) {
$q->orderBy($request->sort_by_column['column'], $request->sort_by_column['order'] );
}, function ($q) use($request){
$q->orderBy('updated_at', 'desc');
})
->paginate();
)
}
我没有测试这个解决方案,但它很适合入门。如果您现在将 state_name
作为参数传递给排序,则排序应该有效。但我不确定你的数据库表和列,所以设置你的 join
工作。
我认为这是个好主意。
祝你好运!