拉拉维尔:按地点排序溶液:附加说明:

2022-08-30 12:34:08

我正在使用SphinxSearch来查询一些内容,并拥有我想用MySQL查询的对象的ID。我的id数组根据狮身人面像给出的等级进行排序。因此,我想做一个像这样的MySQL:

SELECT * FROM table WHERE id IN (1,17,2) 
ORDER BY FIELD(id,1,17,2)

我知道我可以做到:

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

但是我无法获得我所拥有的订单。

我怎样才能用Laravel以适当的方式做到这一点?


答案 1

溶液:

$ids = array(1,17,2);
 
$ids_ordered = implode(',', $ids);
 
$items = static::whereIn('id', $ids)
 ->orderByRaw("FIELD(id, $ids_ordered)")
 ->get();

附加说明:

使用 Eloquent 在 WHERE IN 子句中标题为“一次获取所有项目”的文章中找到的解决方案:

当您想要使用您在 WHERE IN 子句中提供的数组中的 id 顺序按数据库中的项进行排序时很有用。可以很容易地修改以满足您的需求,例如提供不同的ID使用顺序。

// Raw SQL:
// SELECT * FROM items WHERE id IN (1,2,3,4,5) ORDER BY FIELD(id,1,2,3,4,5);
 
$itemIds = array(1,2,3,4,5);
 
$ids = implode(',', $itemIds);
 
$items = static::whereIn('id', $itemIds)
    ->orderByRaw(DB::raw("FIELD(id, $ids)"))
    ->take($limit)
    ->get();

答案 2

我也遇到了这个问题,但我的目标数组元素是字符串。在这种情况下...

$strings = array('xxx','yyy','zzz');

$imploded_strings = implode("','", $strings);

$items = static::whereIn('some_column', $strings)
->orderByRaw(DB::raw("FIELD(some_column, '$imploded_strings')"))
->get();

推荐