【发布时间】:2014-11-28 08:27:37
【问题描述】:
我有两个查询,第一个给我一个 id 数组,按特定顺序排列。然后我将那个 id 数组传递给第二个查询,如下所示:
Operation::whereIn('id', $ids)->get();
但是当我输出该查询的结果时,顺序发生了变化,如果数组 $ids 类似于 (4,2,6,9) 这是我希望结果的顺序,输出将给我2,4,6,9。我怎样才能避免这种情况?
【问题讨论】:
我有两个查询,第一个给我一个 id 数组,按特定顺序排列。然后我将那个 id 数组传递给第二个查询,如下所示:
Operation::whereIn('id', $ids)->get();
但是当我输出该查询的结果时,顺序发生了变化,如果数组 $ids 类似于 (4,2,6,9) 这是我希望结果的顺序,输出将给我2,4,6,9。我怎样才能避免这种情况?
【问题讨论】:
你可以的
$idsImploded = implode(',',$ids);
Operation::whereIn('id', $ids)->orderByRaw("FIND_IN_SET('id','$idsImploded')")->get();
这是MySql没有按照你指定的顺序返回结果的问题,所以你需要在这之后重新排序。
可以在此处找到类似的解决方案:avoid Sorting by the MYSQL IN Keyword
【讨论】:
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 )) 排序
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();
【讨论】:
如果你有4,2,6,9的排序顺序,你可以取这些行,然后用php来排序。
【讨论】: