Подтвердить что ты не робот

Как заказать, где в полях в Ларавеле

Я вычислил в таблице представлений для продуктов в MYSQL, поэтому я перечисляю эти идентификаторы для идентификатора продукта.

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

И я хочу получить продукт из этого идентификатора ссылки.

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

Содержимое продукта верное, но порядок неправильный, как загрузить заказ продукта по идентификатору ссылки, я знаю, что могу сделать это в MySQL, используя ORDER BY FIELD(id,' . $fields . '), но я хочу узнать путь Laravel и надеюсь, что нет используйте команду ORDER BY FIELD, потому что это кажется ненужным для большей эффективности базы данных.

4b9b3361

Ответ 1

Вам нужно будет добавить некоторый raw 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();

Ответ 2

Не уверен, что я полностью понимаю это, но если вы хотите, чтобы товары были заказаны, вы должны использовать

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

$ordered_products = Product::whereIn('id', $rederenceIds)->orderBy('id', 'DESC')->get();

Ответ 3

Если ключ является ключом primay (я думаю, что в этом вопросе это...), вы можете попробовать следующее:

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

Результат Массив, а не Коллекция.

Я не знаю, есть ли у него проблема с эффективностью, но у других задач есть другие проблемы. Например, порядок по полю не поддерживается sqlite, поэтому он не работает при тестировании с помощью базы данных в памяти.