Как заказать, где в полях в Ларавеле
Я вычислил в таблице представлений для продуктов в MYSQL, поэтому я перечисляю эти идентификаторы для идентификатора продукта.
$referenceIds = viewTable::orderBy('score', 'DESC')->lists('product_id');
И я хочу получить продукт из этого идентификатора ссылки.
$products = Product::whereIn('id', $rederenceIds);
Содержимое продукта верное, но порядок неправильный, как загрузить заказ продукта по идентификатору ссылки, я знаю, что могу сделать это в MySQL, используя ORDER BY FIELD(id,' . $fields . ')
, но я хочу узнать путь Laravel и надеюсь, что нет используйте команду ORDER BY FIELD
, потому что это кажется ненужным для большей эффективности базы данных.
Ответы
Ответ 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, поэтому он не работает при тестировании с помощью базы данных в памяти.