更新:2024/12/04

【Laravel】EloquentでWhereを使う方法について

はるか
はるか
Eloquentのwhere、使ったことある?
ふゅか
ふゅか
もちろん!Laravelでデータ操作するなら必須よね!

1. whereのEloquent

EloquentはLaravelのORM(Object-Relational Mapping)で、データベース操作を簡単かつ直感的に行えます。whereEloquentでよく使われるメソッドで、条件に基づいてデータを取得したり操作したりできます。本記事では、whereのEloquentモデルを使った活用方法を解説します。

2. whereの使い方

2.1. where

Eloquentでwhereを使う最も基本的な方法は、条件に一致するレコードを取得することです。

$articles = Article::where('title', 'Laravel Basics')->get();

Articleモデルを使用して、titleLaravel Basicsである記事を取得します。

複数条件を指定する場合も簡単です。

$articles = Article::where('title', 'Laravel Basics')
    ->where('status', 'published')
    ->get();

これはSQLのAND条件に相当します。

2.2. orWhere

orWhereを使うと、OR条件を指定できます。

$articles = Article::where('status', 'draft')
    ->orWhere('views', '>', 100)
    ->get();

この場合、statusdraftまたはviewsが100以上のレコードを取得します。

ふゅか
ふゅか
whereだけじゃなくて、orWhereとかも教えて!
はるか
はるか
いいよ。orWhereは条件の「または」に使う。たとえば、where('status', 'draft')->orWhere('views', '>', 100)
ふゅか
ふゅか
おお!これなら「下書き状態」か「100回以上閲覧された記事」をまとめて取得できるわけね。便利~!

2.3. 範囲条件

2.3.1. whereBetween / orWhereBetween

指定した範囲内のレコードを取得します。

$articles = Article::whereBetween('views', [100, 500])->get();

上記は、viewsが100以上500以下の記事を取得します。

orWhereBetweenを使うと、OR条件で範囲を指定できます。

$articles = Article::where('status', 'published')
    ->orWhereBetween('views', [100, 500])
    ->get();

2.3.2. whereNotBetween / orWhereNotBetween

範囲外のレコードを取得します。

$articles = Article::whereNotBetween('views', [100, 500])->get();

2.4. IN句

whereInは、指定した値のリストに一致するレコードを取得します。

$articles = Article::whereIn('id', [1, 2, 3])->get();

2.4.1. whereNotIn

指定したリストに含まれないレコードを取得します。

$articles = Article::whereNotIn('id', [1, 2, 3])->get();

2.5. Nullの判別

2.5.1. whereNull

カラムがNULLであるレコードを取得します。

$articles = Article::whereNull('deleted_at')->get();

2.5.2. whereNotNull

カラムがNULLでないレコードを取得します。

$articles = Article::whereNotNull('published_at')->get();

2.6. カラム同士の比較

whereColumnは2つのカラムを比較します。例えば、idより、viewsの方が大きいという条件は次のように書くことができます。

$articles = Article::whereColumn('id', '<=', 'views')->get();

orWhereColumnを使用すると、OR条件も可能です。

 

2.7. カラムの範囲条件

2.7.1. whereBetweenColumns

カラムの値が他の2つのカラムの範囲内にあるかを確認します。

$articles = Article::whereBetweenColumns('views', ['min_views', 'max_views'])->get();

同様に、whereNotBetweenColumnsorWhereBetweenColumnsも使用できます。

2.8. サブクエリwhere

サブクエリを使用すれば、別のクエリで取得した値を基準に条件を設定することが可能です。これにより、柔軟な条件設定が簡単に実現できます。

$latestArticles = Article::where('id', function ($query) {
        $query->select('id')
              ->from('articles')
              ->orderBy('published_at', 'desc')
              ->limit(1);
    })
    ->get();

このクエリでは、サブクエリを用いてpublished_at(公開日)が最も新しい記事のidを取得し、それに一致する記事をwhere条件で絞り込んでいます。

ふゅか
ふゅか
サブクエリってどうやって使うの?
はるか
はるか
他のクエリの結果を基に条件設定。

2.9. Where Exists

Where Existsを使用すると、サブクエリの結果に基づいて条件を指定できます。以下は、記事に関連付けられたコメントが存在する記事を取得する例です。

$articles = Article::whereExists(function ($query) {
    $query->select(DB::raw(1)) // ダミーの値を選択
          ->from('comments') // commentsテーブルを参照
          ->whereRaw('comments.article_id = articles.id'); // commentsとarticlesを関連付ける条件
})->get();

 

PR