Laravel で withCount と having を使って絞り込み
はじめに
Laravel で Has Many や Belongs To Many なリレーションを持つモデルに対して、withCount と having を使って対応モデルの数を意識した絞り込みを行う方法。
使用イメージとしては、下記などが考えられる。
- 顧客(
customer
) が n人以上いるお店(shop
)を絞り込む - 部屋(
Room
)の収容可能人数と、利用者(user
)数を比較して空きがあるものを絞り込む
TL;DR
Model::withCount('xxxx')->having('xxxx_count', '>', 1)
のようにすれば良い
目次
環境・条件
1 | $ grep -i pretty /etc/os-release |
詳細
参考: php - Laravel using where clause on a withCount method - Stack Overflow
冒頭に書いた「顧客(customer
) が n人以上いるお店(shop
)を絞り込む」を例に記述。
モデルは下記、customer_shop
のような中間テーブル(交差テーブル)を作成し、belongsToMany
で関係づけられている。
1 | // app/Models/Shop |
適当にレコードを生成し、Tinker 上で確認してみる。
1 | >>> Shop::withCount('customers')->having('customers_count', '>', 1)->get() |
SQL はこんな感じ。
1 | >>> Shop::withCount('customers')->having('customers_count', '>', 1)->toSql() |
あとは適当に Scope を作成すれば良い。(個人的には命名が一番難しいと思っている)
1 | class Shop extends Model |
まとめ
Model::withCount('xxxx')->having('xxxx_count', '>', 1)
のようにすれば良い
参考文献
- Eloquent:リレーション 5.7 Laravel
- データベース:クエリビルダ 5.7 Laravel
- withCount - Illuminate\Database\Eloquent\Concerns\QueriesRelationships | Laravel API
- having - Illuminate\Database\Query\Builder | Laravel API
- php - Laravel using where clause on a withCount method - Stack Overflow
関連記事
- Laravel で現在の URL 取得方法まとめ
- Laravel で Cookie を使う(参照/設定/削除)
- Laravel で PDF ファイルをブラウザで開く
- Laravel で「開始日時 < 終了日時」であることをバリデーションする
- Laravel で生 SQL を実行
- Laravel で有効期限付きの一次的な URL を生成してメールで送信する
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア