この記事で解決できる悩み
いずみ
こんな悩みを解決できる記事を書きました!
僕は現役フリーランスエンジニア(歴9年)で、資格は13個保有しています。
「Laravelのmacro(マクロ)でクエリビルダを共通化する方法を知りたい」とお考えではありませんか?
DBの各テーブルに共通のカラムがあるとして、毎回SQLで条件を書くのが面倒な場合があります。
例えば、データが削除されているかを確認する際に「delete_flg = 0」みたいなWhere句を毎回書かなきゃいけない場合など。
SQLを共通化するためのアプローチはいくつかありますが、今回はマクロで共通化してみます。
ということで、本記事ではLaravelのmacro(マクロ)でクエリビルダを共通化する方法を解説します。
すぐ読み終わるので、ぜひ最後まで読んでくださいませ。
目次
【Laravel】macro(マクロ)でクエリビルダを共通化する方法
早速ですが、Laravelのmacro(マクロ)でクエリビルダを共通化する方法を解説します。
STEP
AppServiceProviderでマクロを登録
use Illuminate\Database\Query\Builder;
public function boot()
{
Builder::macro('withNotDeleted', function () {
return $this->where('delete_flg', 0);
});
}
AppServiceProviderのbootメソッドに上記を追加します。
STEP
必要なクエリで利用
use Illuminate\Support\Facades\DB;
// delete_flg が存在するテーブルの場合
$results = DB::table('your_table')
->withNotDeleted()
->where('other_column', 'value')
->get();
// delete_flg が存在しないテーブルの場合(何もしない)
$resultsNoFlag = DB::table('other_table')
->where('some_column', 'value')
->get();
上記のように使えばOKです。
超簡単ですね。
マクロはかなり便利なのでどんどん使いましょう♪
まとめ
今回は、Laravelのmacro(マクロ)でクエリビルダを共通化する方法について解説しました。
以下が本記事のまとめになります。
- おすすめ本
Laravelの勉強なら「PHPフレームワーク Laravel入門 第2版
最後までお読みいただき、ありがとうございました!
- クソおすすめ本
海外のエンジニアがどういった思考で働いているかが理解できます。
海外に行く気はないけど海外エンジニアの動向が気になる雑魚エンジニアにおすすめです(本当におすすめな本しか紹介しないのでご安心を)。