如何通过Dynamic Laravel和Eloquent关系对结果进行排序

时间:2019-02-24 00:02:56

标签: php laravel laravel-5 eloquent

我知道要对关系的元素进行排序,我们使用with并传递一个函数,以通过关系的特定列告诉Eloquent进行排序

$query->with(['relation' => function ($query) { 
    $query->orderBy('columName', 'ASC');
}]);

我尝试动态地对表之间的关系进行排序和过滤,因为我是通过雄辩的或QueryBuilder来执行对order.fieldrelation格式的排序或搜索,因此它可以动态地适用于任何模型和有关系吗?

我具有一种特质,该方法可以适用于任何模型和任何关系,但是不能正确排序和搜索,也就是说,无法通过其字段对基本模型的记录进行排序和搜索关系where('relation.campo','like','$data');oderBy('relacion.campo','ASC');如何使用Eloquent来完成,或者是否必须使用queryBuilder?

从控制器上我打得很好

return Model::with('relation')->GetDataTable($request);

在我的Trait方法GetDataTable中

public function scopeGetDataTable($query,$request)
{

    $query = $query->searching($request->search);

    if ($request->per_page == -1 ) {
        $perPage  =  $query->count();
    }else{
        $perPage  =$request->per_page;
    }

    if ($request->sortBy == 'null' ) {
        $ordercolumn ='id';
    }else{
        $ordercolumn =$request->sortBy;
    }
    $order =$request->order;
    $pos = strpos($ordercolumn, '.');
    if ($pos !== false) {
        $column = explode(".", $ordercolumn);
        return $query->with([$column[0] => function ($query)  use ($column,$order){ 
            $query->orderBy($column[1],$order ?? 'ASC');
        }])->paginate($perPage);
    }else{
        return  $query->orderBy($ordercolumn ?? 'id', $order ?? 'ASC')
                ->paginate($perPage);
    }
 } 

在我的模型中,我有一个示波器

 public function scopeSearching($query, $que)
 {

        $columns = ['id','','',....];
        foreach($columns as $column){
            $query->orWhere($column, 'LIKE', "%$que%");
        }
    }
 }

2 个答案:

答案 0 :(得分:0)

您可以做这样的事情

SELECT perusahaan.id_perusahaan, perusahaan.namaprshn, petugas.id_petugas, petugas.namaptgs, dokumen.id_dokumen, dokumen.negara_spr FROM perusahaan INNER JOIN petugas ON perusahaan.id_perusahaan=petugas.id_perusahaan INNER JOIN dokumen ON petugas.id_petugas=dokumen.id_petugas

如果您只想要国家数据而没有货币数据,请在查询中添加一个选择

$results = \App\Country::join('currencies', 'currencies.id', '=', 'countries.currency_id')->orderBy('currencies.name')->get();

这将使您获得所有通过货币名称进行货币订购的国家/地区。

您必须将模型更改为模型,并将关系更改为关系。

答案 1 :(得分:0)

您可以使用嵌套关系排序和将现有查询与Eloquent一起使用。

Check Documentation

示例:

$relation_sort = 'asc';
$nested_sort = 'desc';

$result = Model::with([
   'relation' => function($query) use($relation_sort){
      $query->orderBy('relation_column', $relation_sort);
   },
   'relation.nested' => function($query) use($nested_sort){
      $query->orderBy('nested_relation_column', $nested_sort);
   }
])->whereHas('relation', function($query){
    //Relation exists check.
    $query->where('price', '>', 100);

})->whereHas('relation.nested', function($query) use($search_param){
    //Nested Relation search.
    $query->where('search_column', 'LIKE', $search_param);
})->get();