15

我在 MYSQL 中的产品视图表中做了一些计算,所以我列出了这些 id 作为产品参考 id。

$referenceIds = viewTable::orderBy('score', 'DESC')->lists('product_id');

我想从那些参考 id 中获取产品。

$products = Product::whereIn('id', $rederenceIds);

产品内容是正确的,但是顺序不对,如何通过引用id加载产品订单,我知道我可以在MySQL中使用ORDER BY FIELD(id,' . $fields . '),但是我想找出Laravel的方式,希望不要使用ORDER BY FIELD命令,因为它看起来很浪费提高数据库效率。

4

3 回答 3

12

您将不得不注入一些原始 sql,但这不是一场噩梦:

$referenceIds = viewTable::orderBy('score', 'DESC')->lists('product_id');
$referenceIdsStr = implode(',', $referenceIds);
$products = Product::whereIn('id', $rederenceIds)->orderByRaw(DB::raw("FIELD(product_id, $referenceIdsStr)"))->get()->all();
于 2014-12-15T19:52:15.293 回答
0

不确定我是否完全理解这一点,但如果您想要订购产品,您应该使用

$referenceIds = viewTable::lists('product_id');

$ordered_products = Product::whereIn('id', $rederenceIds)->orderBy('id', 'DESC')->get();
于 2013-10-24T08:30:33.117 回答
0

如果键是主键(我认为在这个问题中它是......),你可以试试这个:

$products = Product::whereIn('id', $rederenceIds)->get();
$products = array_replace(array_flip($rederenceIds), $products->getDictionary());

结果是Array,而不是Collection

我不知道它是否有效率问题,但是按字段排序还有其他问题。例如,sqlite 不支持按字段排序,因此它不适用于使用内存数据库进行测试。

于 2015-09-19T06:57:33.290 回答