【问题标题】:How to sort the results by a relation Dynamic Laravel and Eloquent如何通过关系 Dynamic Laravel 和 Eloquent 对结果进行排序
【发布时间】:2019-07-17 18:02:10
【问题描述】:

我知道要对关系的元素进行排序,我们使用 with 并传递一个函数来告诉 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 吗?

从控制器我调用得很好

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%");
        }
    }
 }

【问题讨论】:

  • 请添加整个GetDataTable()方法。
  • @JonasStaudenmeir 我已经添加了它,我也使用了范围,我希望它有助于更​​好地理解我的尝试
  • “订单不正确”是什么意思?
  • @JonasStaudenmeir 您应该按照您的关系字段对父模型的记录进行排序,如果您通过请求relation.name 发送,您应该根据您的关系名称对模型记录进行排序。
  • 请提供一个包含关系、$request 对象和执行查询的最小示例。

标签: php laravel laravel-5 eloquent


【解决方案1】:

您可以在 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();

【讨论】:

    【解决方案2】:

    你可以这样做

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

    这将为您提供按货币名称排序的所有国家/地区。

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

    【讨论】:

    • 感谢您的回答,但请检查清楚,我使用的是 eloquent 而不是查询生成器。
    猜你喜欢
    • 2019-03-15
    • 2019-12-22
    • 2015-03-27
    • 2018-02-10
    • 1970-01-01
    • 2017-12-31
    • 2021-02-10
    • 2014-10-31
    • 2019-08-06
    相关资源
    最近更新 更多