在 Laravel 中通过多对多关系模型对 eloquent 模型进行排序

Posted

技术标签:

【中文标题】在 Laravel 中通过多对多关系模型对 eloquent 模型进行排序【英文标题】:Sorting eloquent model by many-to-many relationship model in Laravel 【发布时间】:2019-12-22 20:35:36 【问题描述】:

我正在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();
    )

所以在这种情况下,如果我想对技术描述的任何细节进行排序,只需将company_technical_decription.established_date 推入$request->sort_by_column['column'] 即可轻松

但是在stateregion 的多对多关系的情况下,我不知道如何继续。

帮我解决。谢谢

【问题讨论】:

【参考方案1】:

我知道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 中通过多对多关系模型对 eloquent 模型进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django REST 中通过多对多发布模型

如何通过多对多关系获取 django 模型?

如何使通过多对多关系连接的模型在 Django admin 中同时在两个地方可编辑?

从laravel中的多对多关系中获取单列

laravel 雄辩,只检查单对多关系中的第一项

laravel 模型关联之(多对多)