我有以下查询:
$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'
我缺少什么?
答案 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);