はじめに
もう1年以上書いていないことにびっくりしました。
2022年あけましておめでとうございます
仕様
DB
Products
id | name | created_at | updated_at |
---|---|---|---|
1 | みかん | 2022-11-24 15:00:00 | 2022-11-24 15:00:00 |
2 | おでん | 2022-11-24 15:00:00 | 2022-11-24 15:00:00 |
3 | らーめん | 2022-11-24 15:00:00 | 2022-11-24 15:00:00 |
... | ... |
こういったDBがありまして、
某サイトみたいな「最近チェックした商品」という機能が欲しいです。
実際にチェックした順番は、「おでん→らーめん→みかん」とします。
whereInの仕様
わい「なるほど!簡単やな」
ProductController.php
public function productHistory()
{
# そのユーザがチェックした商品を取得する処理は省略します
$productIds = [2,3,1]; // 仮データ
$products = Product::whereIn('id', $productIds)->get();
return $products
}
で、できると思っていました。
ですが、APIを叩いてみると「みかん→おでん→らーめん」の順に表示されていました。
???と思い少し調べてみると、どうやらwhereIn
は、配列の順番に関係なく
そのテーブル(今回で言うとProducts)の id
で取得するみたいです。
ここで困ったのが、実際の仕様通りに取得してくるか。
本来はorderBy
を使って取得してくるのですが・・・
解決案
そしていろいろ調べた結果
ProductController.php
public function productHistory()
{
# そのユーザがチェックした商品を取得する処理は省略します
$productIds = [2,3,1]; // 仮データ
$products = Product::whereIn('id', $productIds)
->orderByRaw('FIELD(id, '.implode(',', $productIds).')')
->get();
return $products
}
FIELD
と orderBy
を組み合わせることによって実現させました。
こうすると仕様通りの順番になるので、無事実装することができました。