web-dev-qa-db-ja.com

Laravel更新されていない独自のルールをチェックします

更新セクションに一意の検証ルールがあります。

一意のルールを挿入または追加する場合は'Email' => array('unique:driver_details'),であり、一意の列をチェックします。

しかし、これは更新セクションでは失敗します。更新中は他のルールを満たし、電子メールの一意性において、一意の列をチェックし、失敗しますが、独自のフィールドを確認します。

だから、どうすればデータベース内の独自の値を除いて一意をチェックできますか?

15
user3388086

これにより、特定のIDが無視されます。

'email' => 'unique:table,email_column_to_check,id_to_ignore'

セグメントを置き換えるtableemail_column_to_checkid_to_ignore上記の例

ここで確認できます http://laravel.com/docs/4.2/validation#rule-unique

28
user3714582

Laravel 5およびフォームリクエストを使用する場合、ルートモデルバインディングのモデルのIDを$this->name_of_the_model->idとしてフォームリクエストのプロパティとして直接取得し、それを使用できます。一意のルールから無視します。

たとえば、独自のメールを使用したいが、管理者がユーザーを編集できるようにするには、次のようにします。

ルート:

Route::patch('users/{user}', 'UserController@update');

コントローラ:

public function update(UserRequest $request, User $user) 
{
    // ...
}

フォームのリクエスト:

class UserRequest extends FormRequest
{
    // ...
    public function rules()
    {
        return [
            'name' => 'required|string',
            'email' => [
                'required',
                'email',
                Rule::unique('users')->ignore($this->user->id, 'id')
            ],
            //...
        ];
    }
    //...
}

編集中のユーザーは無視されることに注意してください。この場合、認証されたユーザーとは異なる可能性があります。

12
Arian Acosta

ルールを書いて含める

use Illuminate\Validation\Rule;

次のように検証コードを記述します。

 'Email' => [required,
            Rule::unique('driver_details')->ignore($id),
            ]

ここで$ idは、コントローラーから取得される、検証中に無視する電子メールのIDです。

3
Neeraj Shrestha

私はLaravel 5.2を使用しています

主キーの名前が 'id'の場合、テーブル名はusers_tableであり、user_nameを更新したいので、このようにします

'user_name'  =>  'required|unique:users_table,user_name,'.$id

主キーの名前が「id」ではない場合、私の場合、主キーはuser_idで、テーブル名はusers_tableであり、user_nameを更新します。

だから私はこのようにします

'user_name' => 'required|unique:users_table,user_name,'.$id.',user_id'
2
Nirav Bhoi
$request->validate([
    'email' => 'unique:table_name,email,' . $user->id
]);
2
Ronish

これには少し時間がかかりましたが、更新/作成リクエストを処理しているときは、リクエストオブジェクトにもアクセスできます。ここでは、クライアント名が一意であることを強制していますが、現在編集中のクライアントを許可しています。

class CreateUpdateClientRequest extends FormRequest
{
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => [
                'required',
                'string',
                'min:3',
                'max:50',
                Rule::unique('clients')->ignore($this->request->get('id'))
            ],
            'primary_contact_name' => 'required|string|min:3|max:50',
            'primary_contact_email' => 'required|string|email|min:5|max:50',
            'primary_contact_phone' => 'nullable|string|min:5|max:50',
            'secondary_contact_name' => 'nullable|string|min:3|max:50',
            'secondary_contact_email' => 'nullable|string|email|min:5|max:50',
            'secondary_contact_phone' => 'nullable|string|min:5|max:50',
            'notes' => 'nullable'
        ];
    }
}
1
Juha Vehnia

これを試して

'email' => 'unique:table_name,column_name,'.$this->id.',id'

$this->idはリクエストの値になります

1
mwafi

しばらくの間、この問題に直面しています。これを試して:

$v = Validator::make($request->all(), [
    'email' => ['required',
    Rule::unique('<table_name>')->ignore(<your_table_id_to_ignore>),
    ]
]);

Laravel 5.8で動作します。Laravelの下位バージョンで動作するかどうかはわかりません。

0
fabian

Laravel 6アプリでは、現在のユーザーのメールを検証から除外するのに役立ちました:

use Illuminate\Validation\Rule;

public function update(Request $request, $id)
{
    $request->validate([
        'email' => [
            'email',
            'required',
             Rule::unique('claims')->ignore($id),
        ],
    ]);

    // ...
}
0
yesnik