laravel
laravel5.5

LaravelのExistsバリデーションで存在チェックする列名がパラメータのnameと異なる場合の解決策

More than 1 year has passed since last update.

LaravelのバリデーションのExistsの存在チェックで、
Ruleを利用した少し複雑なチェックをするときにテーブルの列名がパラメータのnameと異なる場合、
マニュアルに記載がなかったので共有。

環境

名前 バージョン
PHP 7.1.6
Laravel 5.5.14

解決方法

存在チェックするテーブル「posts」の「id」列にパラメータのpost_idが存在するかチェックする場合、
Rule::exists()の第二引数にテーブルの列名を指定すればOKです。
以下のような感じです。

$request->validate([
    'type' => 'required|integer',
    'post_id' => [
        'required',
        'integer',
        Rule::exists('posts', 'id')->where(function ($query) use ($request) {  // ★この行
            $query->where('type', $request->input('type'));
        }),
    ],
]);

バリデーションのソースを読むと、

Illuminate\Validation\Rule.php
    /**
     * Get a exists constraint builder instance.
     *
     * @param  string  $table
     * @param  string  $column
     * @return \Illuminate\Validation\Rules\Exists
     */
    public static function exists($table, $column = 'NULL')
    {
        return new Rules\Exists($table, $column);
    }

とあり、列名を指定しろとありました。。