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 不保存一对多关系

Laravel、MySQL 空间点距离:orderBy 和获取距离

Laravel 5.2 orderBy与ofCount的关系导致SQL错误,因为尝试获取列而不是计数失败

Laravel orderby 加入 2 个没有雄辩关系的表

Laravel 5:如何使用 'where' 或 'orderBy' 使用 eloquent?

laravel框架orderBy问题