laravelのバリデーターは、追加の列をチェックする必要がある場合など、既存のデータベース・ルールのカスタマイズを行うことができます。 the manualから例:閉鎖でラベリング検証ツールのカスタム存在ルールに結合を追加するにはどうすればよいですか?
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::exists('staff')->where(function ($query) {
$query->where('account_id', 1);
}),
],
]);
query
はtypehintedないので、私はこれはオブジェクトの種類は非常に肯定的ではないよされています。私はDatabaseRule
自体がwhere
、wherenot
などについていくつかの機能しか持っていないことを見ることができますが、私はミックスに結合を追加しようとしています。
与えられた例では、account_id = 1
のスタッフの電子メールが存在する必要がありますが、チーム(すべてのスタッフがチームの一部であり、separteテーブルです)に特定のプロパティが必要です。 team.active = 1
?
全スタッフ/チームの事は
コースの一例ですので、最後に私は思ったんだけど:は、どのように私はこのルールに参加を追加することができますので、私たちはスタッフのチームが持っていることを確認してください列「アクティブ」は1です。
私の最初の問題は次のようなものです:そのタイプは何ですか$query
?私はこのようなものは素晴らしいだろうと想像するだろうが、これが有効である疑う理由はありません。
Rule::exists('staff')->where(function ($query) {
$query
->join('team', 'team.team_id', '=', 'staff.team_id')
->where('team.active', 1);
})
これは動作するようには思えません。奇妙なことは、エラーが発生することはありません自体に参加するということですが、無視しているように見える:
列が見つかりません:
で1054不明な列「team.active」「where句」
(SQL:staff
から骨材としてのカウント(*)を選択する場所team
。active
= 1)私は、この機能が利用可能であることをギャンブルだと私は、これは(小さな変更を動作するように期待しているだろう
)ここで)、存在しない関数を呼び出しているのでエラーが発生します。しかし、私が得るのは、ビルドされているが結合がないクエリです。
コメントから、その機能に$query->toSQL()
を追加しました。これはかなり期待される結果を示していますが、それは私が取得していますエラーで計算しない:
select * from `staff`
inner join `teams` on `teams`.`team_id` = `staff`.`team_id`
where `teams`.`active` = ?
ルールクロージャ内からのvarダンプ '$ query-> toSql()'を試してみて、次を参照してください。
かいつまんで、私はちょうどこのような何かを探して
passes
機能を備えたカスタム検証ルールを作成しましたあなたが得るもの。 '$ query'は' Illuminate \ Database \ Query \ Builder'のインスタンスなので、参加することに問題はありません。 – TheFallenカスタム検証ルールはどうですか? [doc here](https://laravel.com/docs/5.5/validation#custom-validation-rules) – Maraboc
@Marabocはい、それはフォールバックですが、これは最も読みやすく/いい方法ですそれ。 – Nanne