存在するメールアドレスの入力を検証しようとしていますが、company_idがリクエストで渡されたcompany_idと同じである場合に限ります。
このエラーが発生します...
SQLSTATE [42S22]:列が見つかりません:1054「where句」の不明な列「1」(SQL:email_address = myemail.comおよび1 <> company_idであるcompany_usersからの集計としてcount(*)を選択)
私はオンラインで読んだことがありますが、その方法は、検証内のテーブルと列を関連付けることです。これは私が行っていることです。
これは私の現在のコードです...
required|email|unique:company_users,email_address,company_id,' . $request->company_id
これで大まかなアイデアがありますあなたはあなたが何を達成することができます
Rule
クラスを使用して、検証ルールをカスタマイズできます。
'email' => ['required', 'string', 'email', 'max:191',Rule::unique('users')->where(function ($query) use ($request) {
return $query->where('company_id', $request->company_id);
})],
お役に立てれば
次のようにする必要があります。
required|email|unique:company_users,email_address,' . $request->company_id
形式は次のとおりです。
unique:table,column,'id to exclude'
または、列に基づいて検証する場合は、別のクエリを実行できます。
$exists = Model::where('company_id','!=',$request->company_id)->where('email',$request->email)->count()
if($exists) {
// return an error or a validation error
}
これはあなたの質問に答えるはずです。
'required|email|unique:company_users,email_address,NULL,id,company_id,' . $request->company_id
つまり、id
がNULL
で、そのcompany_id
が$request->company_id
と同じ行を無視する場合、電子メールはniqueである必要があります。
exceptパラメータは、検証と比較するために行を無視します。たとえば、[email protected]
のメールアドレスはすでにユーザー1
によって取得されていますが、次のようにしました。
'unique:company_users,email_address,1'
id
が1のユーザーは無視されます。したがって、同じメールアドレスのユーザーはexistingであるため、同じメールアドレスの入力は引き続き通過します。無視されました。
特別な行を無視したくないが、条件に基づいて行を無視したいので、これはあなたの場合と同じではありません。これが、フィールド検証を追加することで、この回答がどのように役立つかですafterignoreパラメーター。
これを見てみたいと思うかもしれません: laravel 4:検証一意(データベース)複数のwhere句
変数を$request->company_id
一重引用符で囲んで、'
を文字列にします。それ以外の場合、MySQLはテーブルの列であると見なします。
required|email|unique:company_users,email_address,company_id,"'" . (int) $request->company_id . "'"