OrderBy 与 laravel eloquent 中的“关系”
Posted
技术标签:
【中文标题】OrderBy 与 laravel eloquent 中的“关系”【英文标题】:OrderBy with 'relationship' in laravel eloquent 【发布时间】:2019-05-14 21:10:54 【问题描述】:我有以下表格,
用户(ID、姓名) 类别(id、category_name、顺序)user_category(id、user_id、category_id)
专业(id、spe_name)
user_specialities(id、spe_id、user_id)我试图让所有具有所有相关专业的用户按“订单”在一个类别中排序,每个用户在表“user_category”中的类别下。
我已尝试使用“与”关系,但我无法在此查询中排序。
有什么我可能错的想法吗?
【问题讨论】:
您可以发布您的查询吗? $query = Coach::with(['specialities','specialities.speciality','coachUnderCategories', 'coachUnderCategories.coachCategory']) ->orderBy('coach_categories.order', 'desc '); 是的,我也尝试过这种方式,但数据“与”专业关系始终为空。 没有你使用的coach_categories 模型功能,按照下面我给出的答案然后工作。 在你的回答中,'supplier.id' 什么是供应商?它是表名还是关系属性? 【参考方案1】:With()
我认为使用 sql 运算符 whereIn 进行多个查询,因此当您尝试对其进行 orderBy 时,您没有可用的字段。
有两种方法可以解决这个问题,
要么你 join()
将表放在一起,然后 orderBy
在连接字段上,要么你像这样对查询结果的集合进行排序
$sortedResult = SomeModel::with('all your relations')->get()
->sortByDesc(function ($anItem)
return $anItem->category->order;
)->all();
如果你想加入,这里有另一个帖子:Sort collection by relationship value
根据评论编辑
User::join('user_category', 'user_category.user_id', '=', 'user.id')
->join('user_specialities', 'user_specialities.user_id', '=', 'user.id')
->select('user.*')
->selectRaw('(select group_concat(spe_name) from specialities where specialities.id = user_specialiliteies.spe_id) as specialities')
->orderBy('user_category.order')
->get();
【讨论】:
另外,如果你加入表格,你不会得到 ['model' => 'relation' => []] 结构,只是一个扁平的 ['allAttributes' => 'andValues' , ...] 我以前试过这个,它可以工作,但不能用于分页。 当我尝试加入表格时,我可以通过 orderby 获取数据,但无法通过 'group_concat' 获取单行中的多个专业。 是的,获取所有内容并在之后进行排序会导致优化效果不佳。我认为答案编辑部分中的查询有效,但不是那么漂亮,希望它有所帮助,如果您找到更好的方法,请告诉我!至少它应该同时处理 orderBy 和 group_concat。以上是关于OrderBy 与 laravel eloquent 中的“关系”的主要内容,如果未能解决你的问题,请参考以下文章
Laravel、MySQL 空间点距离:orderBy 和获取距离
Laravel 5.2 orderBy与ofCount的关系导致SQL错误,因为尝试获取列而不是计数失败
Laravel orderby 加入 2 个没有雄辩关系的表