🍣
【Laravel】何気なく使っている無名関数
無名関数とは
PHPの公式ドキュメントでは下記のように説明されています。
無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。 callable パラメータとして使う際に便利ですが、用途はそれにとどまりません。
無名関数の実装には Closure クラスを使っています。
普段はコールバックを使うときに割と意識的に使用していましたが、そう言えばLaravelでも何気なく使っているな、と思いLraravelで無名関数(コールバック関数)を使用するケースをまとめてみました。
使用例
1.ルートの定義
第2引数に無名関数を指定して、URL(第1引数)が叩かれた時に実行したい処理を記述します。
下記の例ではユーザがGET
リクエストで/
にアクセスしたとき、welcome
というビューを表示することを示しています。
routes/web.php
Route::get('/', function () {
return view('welcome');
});
2.マイグレーションでテーブルを作成する
下記のファイルと元にマイグレーションを実行するとtasks
テーブルが新規作成され、無名関数内の記述を元にテーブルのカラムが作成されます。
database/migrations/2021_05_28_005102_create_tasks_table.php
public function up()
{
Schema::create('tasks', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
}
3.サブクエリ
クエリビルダで少し複雑な条件をつけるときに使います。
例1:join
で複数条件をつける場合
authors
テーブルにbooks
テーブルをjoin
させるときに、外部キーが同じものを紐つけるだけでなく、価格とページ数で絞り込んでいます。
$query->join('books', function ($join) {
$join->on('authors.id', '=', 'books.author_id')
->where('books.price', '<', 500)
->where('books.pages', '<', 100);
})
例2: A=500 AND (B=
下記は本の値段が500円、かつ本のページが$page1
か$page2
のデータを絞り込むクエリです。
$query->where('books.price', 500)
->where(function ($subquery) use ($page1, $page2) {
$subquery->where('books.pages',$page1)
->orwhere('books.pages', $page2);
});
Discussion