こんにちわ、また積雪の可能性があるようで震えてるTakaです。今回はLaravelネタをひとつ。備忘録もかねてEloquentでデータ操作する場合にクエリを動的に生成する方法を紹介したいと思います。
なお、Laravelとはなんぞやという方は下の記事を参照してください!
環境
今回の環境は下記の通りとなります。
今回の環境
- Laravel 5.5
- MySQL 5.6.37
Eloquentのクエリを動的に生成する方法
さてさて、Laravelに関わらずDB操作をしていると、クエリを動的に生成したいケースが結構あります。特に複雑なフィルタリングやソートを実装したい場合は動的に生成した方がコードの冗長化を避けることもでき、より綺麗なコードになります。
LaravelのEloquentでクエリを動的に生成する方法は、やり方さえ分かればいたって簡単です。
例えば、下記のようなEloquent文があるとします。
$data = Data::where('name', 'LIKE', '%山田%')->where('age', '>=', 20)->get();
このコードは、datasテーブルから名前に「山田」が含まれ、かつ年齢が20歳以上の条件に該当するデータを取得します。
そして、このコードは下記のように書き換えることができます。
$q = Data::query();
$q->where('name', 'LIKE', '%山田%');
$q->where('age', '>=', 20);
$data = $q->get();
このように書くことで、クエリに条件を追加していくことができます。
つまり、上記のように条件を追加できるということで容易にクエリの動的生成が可能になります。
例えば、名前のあいまい検索(LIKE)にAND条件を追加したい場合は、このように書くことで実現できます。
$name = array('山田','花子');
$q = Data::query();
foreach ($name as $key => $value) {
$q->where('name', 'LIKE', '%'.$value.'%');
}
$q->where('age', '>=', 20);
$data = $q->get();
このコードは、datasテーブルから名前に「山田」かつ「花子」が含まれ、かつ年齢が20歳以上という条件に該当するデータを取得します。AND条件で検索したいパラメータを配列に入れて、foreachで繰り返してあげることで動的にクエリの生成ができるというわけです。
OR検索をしたい場合も下記のようなコードを書けば実現できます。
$name = array('山田','鈴木','佐藤');
$q = Data::query();
foreach ($name as $key => $value) {
if($key == 0){
$q->where('name', 'LIKE', '%'.$value.'%');
}else{
$q->orWhere('name', 'LIKE', '%'.$value.'%');
}
}
$q->where('age', '>=', 20);
$data = $q->get();
このコードは、名前に「山田」か「鈴木」か「佐藤」のいずれかが含まれていて、かつ年齢が20歳以上という条件に該当するデータを取得します。
このように、Laravelでは容易に動的クエリを生成できます。
以上、今回はここまで!Takaでした。また!
この記事のまとめ
- LaravelのEloquentのクエリを動的に生成する方法