web-dev-qa-db-ja.com

Laravel |一意の検証where句

存在するメールアドレスの入力を検証しようとしていますが、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
5
user8116198

これで大まかなアイデアがありますあなたはあなたが何を達成することができます

Ruleクラスを使用して、検証ルールをカスタマイズできます。

'email' => ['required', 'string', 'email', 'max:191',Rule::unique('users')->where(function ($query) use ($request) {
    return $query->where('company_id', $request->company_id);
})],

お役に立てれば

9
Adnan Mumtaz

次のようにする必要があります。

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
}
4
Sletheren

これはあなたの質問に答えるはずです。

'required|email|unique:company_users,email_address,NULL,id,company_id,' . $request->company_id

つまり、idNULLで、そのcompany_id$request->company_idと同じ行を無視する場合、電子メールはniqueである必要があります。

exceptパラメータは、検証と比較するために行を無視します。たとえば、[email protected]のメールアドレスはすでにユーザー1によって取得されていますが、次のようにしました。

'unique:company_users,email_address,1'

idが1のユーザーは無視されます。したがって、同じメールアドレスのユーザーはexistingであるため、同じメールアドレスの入力は引き続き通過します。無視されました。

特別な行を無視したくないが、条件に基づいて行を無視したいので、これはあなたの場合と同じではありません。これが、フィールド検証を追加することで、この回答がどのように役立つかですafterignoreパラメーター。

これを見てみたいと思うかもしれません: laravel 4:検証一意(データベース)複数のwhere句

2
Wreigh

変数を$request->company_id一重引用符で囲んで、'を文字列にします。それ以外の場合、MySQLはテーブルの列であると見なします。

required|email|unique:company_users,email_address,company_id,"'" . (int) $request->company_id . "'"
0
Marwelln