🍣

【Laravel】何気なく使っている無名関数

2021/05/28に公開

無名関数とは

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=page1 OR C=page2)
下記は本の値段が500円、かつ本のページが$page1$page2のデータを絞り込むクエリです。

$query->where('books.price', 500)
      ->where(function ($subquery) use ($page1, $page2) {              
          $subquery->where('books.pages',$page1)
                   ->orwhere('books.pages', $page2); 
        });

Discussion