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);
}
とあり、列名を指定しろとありました。。