I’ve been trying make my validation so that an extension must be unique to it’s own company but not to other companies. Here is my DB table:
$table->id(); $table->foreignId('user_id')->constrained(); $table->foreignId('account_id')->constrained()->onDelete('cascade'); $table->string('first_name')->nullable(); $table->string('last_name')->nullable(); $table->string('email'); $table->string('extension'); $table->string('password')->nullable(); $table->string('user_type')->default('user'); $table->timestamps(); $table->unique(['extension', 'account_id'], 'unique_extension');
And my validation rule looks like this:
public function rules() { return [ 'editExtension.first_name' => 'required|max:255', 'editExtension.last_name' => 'required|max:255|', 'editExtension.email' => ['required', 'email','max:255', Rule::unique('account_users', 'email')->ignore($this->editExtension->id)], 'editExtension.extension' => ['required', 'numeric', Rule::unique('account_users', 'extension', $this->client_id)->ignore($this->editExtension->id)], 'editExtension.password' => 'required|max:255', 'editExtension.user_type' => 'required|in:user,admin', ]; }
But still I got errors saying that the extension number is already taken. It seems that the Unique rule doesn’t accept multiple columns, only one. Is this true?
How can I fix this?
Advertisement
Answer
Forcing A Unique Rule To Ignore A Given ID:
UPDATING AN EXISTING RECORD.
“account_users” => Table name.
“account_id”, “extension” => The 2 fields to check for uniqueness.
ID of currently edited row here. => The id (primary key) to ignore. (The currently updated/edited table row id.)
Rule::unique("account_users")->where( function ($query) use ($request) { return $query->where( [ ["account_id", "=", $request->account_id], ["extension", "=", $request->extension] ] ); })->ignore(/* ID of currently edited row here. */)
CREATING A NEW RECORD.
Rule::unique("account_users")->where( function ($query) use ($request) { return $query->where( [ ["account_id", "=", $request->account_id], ["extension", "=", $request->extension] ] ); })
Addendum
By default, the
unique
rule will check the uniqueness of the column matching the name of the attribute being validated. However, you may pass a different column name as the second argument to theunique
method:
Rule::unique("account_users", "extension")->where(...)