[英]Sorting eloquent model by many-to-many relationship model in Laravel
我正在Laravel 5.8
上構建一個應用程序,我有一個名為company
, technical_description
, 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
作為表格標題。 我想根據這些關系排序,所以我在控制器中嘗試:
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();
)
}
因此,在這種情況下,如果我想對技術描述的任何細節進行排序,只需在$request->sort_by_column['column']
推送company_technical_decription.established_date
。
但是,如果state
和region
之間存在多對多的關系,那我就不知道如何進行。
幫助我解決它。 謝謝
我知道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
工作。
我認為這是個好主意。
祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.