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

时间:2019-08-16 14:00:47

标签: laravel eloquent laravel-5.8

我正在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 个答案:

答案 0 :(得分: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设置为可用。

我认为这是个好主意。

祝你好运!