【问题标题】:Laravel MySQL how to order results in the same order as in whereIn clauseLaravel MySQL如何以与whereIn子句相同的顺序对结果进行排序
【发布时间】:2014-11-28 08:27:37
【问题描述】:

我有两个查询,第一个给我一个 id 数组,按特定顺序排列。然后我将那个 id 数组传递给第二个查询,如下所示:

 Operation::whereIn('id', $ids)->get();

但是当我输出该查询的结果时,顺序发生了变化,如果数组 $ids 类似于 (4,2,6,9) 这是我希望结果的顺序,输出将给我2,4,6,9。我怎样才能避免这种情况?

【问题讨论】:

    标签: mysql laravel-4 eloquent


    【解决方案1】:

    你可以的

    $idsImploded = implode(',',$ids);
    Operation::whereIn('id', $ids)->orderByRaw("FIND_IN_SET('id','$idsImploded')")->get();
    

    这是MySql没有按照你指定的顺序返回结果的问题,所以你需要在这之后重新排序。

    可以在此处找到类似的解决方案:avoid Sorting by the MYSQL IN Keyword

    【讨论】:

    • 语法错误或访问冲突:1582 调用本机函数“FIND_IN_SET”时参数计数不正确(SQL:select * from operations where id in (42, 3, 4, 37, 16, 38, 39, 14, 17) 按 FIND_IN_SET(id,42,3,4,37,16,38,39,14,17 )) 排序
    • 已修复。我忘记在 FIND_IN_SET 参数中添加“”。
    【解决方案2】:

    MySQL 排序方式与where in 子句中的顺序相同:

    $ids; // array of ids
    $placeholders = implode(',',array_fill(0, count($ids), '?')); // string for the query
    
    Operation::whereIn('id', $ids)
       ->orderByRaw("field(id,{$placeholders})", $ids)->get();
    

    【讨论】:

    • @JarekTkaczyk 你已经通过一些随机值解决了我同样的顺序问题。非常感谢。
    【解决方案3】:

    如果你有4,2,6,9的排序顺序,你可以取这些行,然后用php来排序。

    【讨论】:

    • 我以后需要能够使用 eloquent 从与操作相关的表中获取更多信息,我怎样才能在不丢失该功能的情况下对该查询返回的对象进行排序?
    • 如,在我看来,我想做 $operations->event->name,其中 event 是一个相关的表,而操作是来自我的问题中的查询。
    • 你可以先把所有的信息放好再排序
    • 我不想在视图上做所有这些,我更喜欢其他解决方案,但我想你的解决方案也可以
    猜你喜欢
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    相关资源
    最近更新 更多