ホームページ >バックエンド開発 >PHPチュートリアル >Laravel Eloquent を使用してテーブル内の各固有の販売者の最新の行を取得するにはどうすればよいですか?

Laravel Eloquent を使用してテーブル内の各固有の販売者の最新の行を取得するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-25 14:57:02270ブラウズ

How can I retrieve the latest row for each unique seller in a table using Laravel Eloquent?

Laravel Eloquent を使用して Max Created_at で最新の行を取得する

Laravel Eloquent では、一意のフィールドごとに最新の行を取得できます。包括的なアプローチ。売上を追跡する特定のテーブルで、各エントリに id、seller_id、amount、created_at などのフィールドが含まれている場合、目的は、個別の sell_id ごとに最新の行を取得することです。

最新の取得特定の販売者の行

特定の販売者の最新の行を取得するために、Laravel Eloquent は簡単な方法を提供します。

<code class="php">$sales = Snapshot::where('seller_id', '=', 15)
    ->orderBy('created_at', 'DESC')
    ->first();</code>

このクエリは、スナップショット テーブルからすべてのレコードを選択します。 sell_id は 15 に等しく、created_at に基づいて降順で並べ替え、最初の行を取得して、事実上、その販売者の最新の売上を返します。

各販売者の最新の行の取得

このアプローチを拡張して個々の販売者の最新の行を取得するには、より高度な戦略が必要になります。次の SQL クエリは、このタスクを実行します。

<code class="sql">select s.*
from snapshot s
left join snapshot s1 on s.seller_id = s1.seller_id
and s.created_at < s1.created_at
where s1.seller_id is null

このクエリでは、サブクエリ s1 が条件 s.created_at <🎜 に基づいてレコードを選択します。 s1.created_at: 後続の行の created_at タイムスタンプが新しいレコードのみが含まれるようにします。次に、外側のクエリは、サブクエリに一致する行がないメイン テーブルからすべての行を選択し、各 seller_id の最新レコードを効果的に分離します。

Laravel Eloquent でのクエリの実装

Laravel Eloquent を使用してこのクエリを実装するには、クエリ ビルダー メソッドを利用できます。

<code class="php">DB::table('snapshot as s')
  ->select('s.*')
  ->leftJoin('snapshot as s1', function ($join) {
        $join->on('s.seller_id', '=', 's1.seller_id')
             ->whereRaw(DB::raw('s.created_at < s1.created_at'));
   })
  ->whereNull('s1.seller_id')
  ->get();</code>

このクエリは、スナップショット テーブルとサブクエリの間で左結合を実行することで SQL クエリの機能を複製します。 (s1) 各seller_idの後の行を識別します。 whereNull 条件は後続の行を持つ行をフィルターで除外し、各 seller_id の最新レコードのみを残します。このクエリを実行すると、テーブル内の各固有の販売者の最新の売上のコレクションが返されます。

以上がLaravel Eloquent を使用してテーブル内の各固有の販売者の最新の行を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。