按关系列排序

时间:2016-07-08 07:52:28

标签: laravel eloquent

我有以下查询:

$items = UserItems::with('item')
        ->where('user_id','=',$this->id)
        ->where('quantity','>',0)
        ->get();

我需要按item.type订购,所以我尝试了:

$items = UserItems::with('item')
        ->where('user_id','=',$this->id)
        ->where('quantity','>',0)
        ->orderBy('item.type')
        ->get();

但我得到Unknown column 'item.type' in 'order clause'

我缺少什么?

3 个答案:

答案 0 :(得分:9)

join()工作得很好,感谢@rypskar评论

$items = UserItems
        ::where('user_id','=',$this->id)
        ->where('quantity','>',0)
        ->join('items', 'items.id', '=', 'user_items.item_id')
        ->orderBy('items.type')
        ->get();

答案 1 :(得分:6)

好吧,您的急切加载可能无法构建您期望的查询,您可以通过启用查询日志来检查它。

但我可能只是使用集合过滤器:

$items = UserItems::where('user_id','=',$this->id)
        ->where('quantity','>',0)
        ->get()
        ->sortBy(function($useritem, $key) {
          return $useritem->item->type;
        });

答案 2 :(得分:0)

我发现了另一种使用相关模型中的字段对数据集进行排序的方法,您可以在模型中获得一个函数,该函数获得与相关表的唯一关系(例如:与房间类别相关的表房间,而房间与按类别ID关联的类别相关,您可以使用“ room_category”之类的函数,该函数根据“房间模型”的类别ID返回相关的类别),然后代码如下:

Room::with('room_category')->all()->sortBy('room_category.name',SORT_REGULAR,false);

这将为您提供按类别名称排序的房间

我在一个具有服务器端处理的DataTable的项目中执行了此操作,并且我遇到了需要按相关实体的字段进行排序的情况,我做到了这一点,并且它可以正常工作。更容易,更适合MVC标准。

您的情况将以类似的方式进行:

User::with('item')->where('quantity','>',0)->get()->sortBy('item.type',SORT_REGULAR,false);