我正在使用SphinxSearch查询某些内容,并具有要使用MySQL查询的对象的ID。我的ID数组根据Sphinx给出的排名进行排序。 因此,我想创建一个类似以下的MySQL查询:
SELECT * FROM table WHERE id IN (1,17,2)
ORDER BY FIELD(id,1,17,2)
我知道我能做到:
Table::whereIn('id', $ids)->get();
但我无法获得我之前拥有的订单。
我该如何使用Laravel以恰当的方式实现?
$ids = array(1,17,2);
$ids_ordered = implode(',', $ids);
$items = static::whereIn('id', $ids)
->orderByRaw("FIELD(id, $ids_ordered)")
->get();
使用在一篇名为使用Eloquent按照WHERE IN子句中ID的当前顺序一次性获取所有项目并排序的文章中找到的解决方案:
当您想通过在WHERE IN子句中提供的ID数组的顺序对数据库中的项目进行orderBy时,这将非常有用。可以轻松修改以适应您的需求,例如提供不同的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();
$strings = array('xxx','yyy','zzz');
$imploded_strings = implode("','", $strings);
$items = static::whereIn('some_column', $strings)
->orderByRaw(DB::raw("FIELD(some_column, '$imploded_strings')"))
->get();
$searchedStrings = "'".implode("', '", $originalArrayOfStrings)."'";
- Banik$category_id = Category::select('id')->orderby('name','ASC')->get()->pluck('id')->toArray();
:-)
。 - halfer
orderByRaw
。 - ceejayoz