簡體   English   中英

通過Laravel中的多對多關系模型對雄辯模型進行排序

[英]Sorting eloquent model by many-to-many relationship model in Laravel

我正在Laravel 5.8上構建一個應用程序,我有一個名為companytechnical_descriptionstateregion 公司可以在許多州擁有許多地點,因此公司和州/地區具有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 NameTechnical DetailsStateRegion作為表格標題。 我想根據這些關系排序,所以我在控制器中嘗試:

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

但是,如果stateregion之間存在多對多的關系,那我就不知道如何進行。

幫助我解決它。 謝謝

我知道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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM