0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Laravel】最近WhereInの返す順番で詰まった・・・

Posted at

はじめに

もう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
}

FIELDorderByを組み合わせることによって実現させました。
こうすると仕様通りの順番になるので、無事実装することができました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?