微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

这个方法我有一个特性,它可以适用于任何模型和任何关系,但它没有正确排序和搜索,也就是说,通过其关系的字段排序和搜索基础模型的记录在哪里( ‘relation.campo’, ‘喜欢’, ‘$数据’);和oderBy(‘relacion.campo’,’ASC’);如何使用Eloquent完成,或者我必须使用queryBuilder if或者什么?

从控制器我打电话好

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

解决方法:

你可以做这样的事情

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐