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

问题描述 投票:4回答:2

我知道为了对关系的元素进行排序,我们使用并传递一个函数告诉Eloquent按关系的特定列排序

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

我尝试动态地对表之间的关系进行排序和过滤,因为我发送了relation.fieldrelation格式来订购或搜索,就像我从eloquent或QueryBuilder那样做,这样它可以动态地工作,适用于任何模型和任何关系?

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

从控制器我打电话好

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%");
        }
    }
 }
php laravel laravel-5 eloquent
2个回答
0
投票

你可以做这样的事情

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

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

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

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

您必须将模型更改为模型以及与关系的关系。


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();

© www.soinside.com 2019 - 2024. All rights reserved.