'Forcing ignore validation for string Primary Key not working in Laravel 8 to update data
i need a help with my laravel app. i have a table with this structure:
Schema::create('kliens', function (Blueprint $table) {
$table->string('KlienUIC', 10)->primary();
$table->string('NamaLahir', 50);
$table->string('NamaPanggilan', 10)->nullable();
$table->date('TanggalLahir');
$table->string('KategoriKlien', 10);
$table->unsignedBigInteger('StafPendampingId');
$table->timestamps();
$table->foreign('StafPendampingId')->references('StafId')->on('stafs')->onUpdate('cascade');
});
and the model is:
protected $primaryKey = 'KlienUIC';
public $incrementing = false;
protected $keyType = 'string';
use HasFactory;
protected $fillable = ['KlienUIC', 'NamaLahir', 'NamaPanggilan', 'TanggalLahir', 'KategoriKlien', 'StafPendampingId'];
i want to update my existing data but it keeps give me The klienuic has already been taken.
error message when i don't change my KlienUIC
value.
this is my update method and the validation (with some other attempts to force the ignore validation, and they all still error):
public function update(Request $request, Klien $klien)
{
$validatedData = Validator::make($request, [
// 'klienuic' => Rule::unique('kliens', 'KlienUIC', $klien->KlienUIC)->ignore($klien->KlienUIC, 'KlienUIC'),
// 'klienuic' => ['required','size:10',Rule::unique('kliens', 'KlienUIC')->ignore($klien->KlienUIC, 'KlienUIC')],
// 'klienuic' => ['required','size:10',Rule::unique('kliens', 'KlienUIC')->ignore($id)],
// 'klienuic' => 'required|size:10|unique:kliens,KlienUIC,'.$this->klien->KlienUIC,
// 'klienuic' => ['required','size:10',Rule::unique('kliens', 'KlienUIC')->ignore($this->klien)],
// 'klienuic' => 'required|size:10|unique:kliens,KlienUIC,'.$klien->KlienUIC,
// 'klienuic' => ['required','size:10',Rule::unique('kliens')->ignore($klien->KlienUIC)],
// 'klienuic' => ['required','size:10',Rule::unique('kliens', 'KlienUIC')->ignore($klien->KlienUIC, 'KlienUIC')],
'klienuic' => ['required','size:10','unique:kliens,KlienUIC'],
'namalahir' => 'required|min:3|max:50',
'namapanggilan' => 'min:3|max:10',
'tanggallahir' => 'required',
'kategoriklien' => 'required',
'stafpendamping' => 'required'
]);
Klien::where('KlienUIC', $klien->KlienUIC)
->update([
'KlienUIC' => $validatedData['klienuic'],
'NamaLahir' => $validatedData['namalahir'],
'NamaPanggilan' => $validatedData['namapanggilan'],
'TanggalLahir' => $validatedData['tanggallahir'],
'KategoriKlien' => $validatedData['kategoriklien'],
'StafPendampingId' => $validatedData['stafpendamping']
]);
return redirect('/kliens')->with('success', 'Data klien berhasil diperbaharui.');
}
i'm using Laravel 8.83.10
. thank you all
Solution 1:[1]
You're trying to update the primary key which isn't gonna work, primary keys usually don't get updated.
Besides that you can use the model that is injected as a parameter to update the data instead of using the Klien::where()
which returns a QueryBuilder
$klien->fill([
'NamaLahir' => $validatedData['namalahir'],
'NamaPanggilan' => $validatedData['namapanggilan'],
'TanggalLahir' => $validatedData['tanggallahir'],
'KategoriKlien' => $validatedData['kategoriklien'],
'StafPendampingId' => $validatedData['stafpendamping']
]);
$klien->save();
Edit:
public function update(Request $request, Klien $klien)
{
$validatedData = Validator::make($request, [
'namalahir' => 'required|min:3|max:50',
'namapanggilan' => 'min:3|max:10',
'tanggallahir' => 'required',
'kategoriklien' => 'required',
'stafpendamping' => 'required'
]);
$klien->fill([
'NamaLahir' => $validatedData['namalahir'],
'NamaPanggilan' => $validatedData['namapanggilan'],
'TanggalLahir' => $validatedData['tanggallahir'],
'KategoriKlien' => $validatedData['kategoriklien'],
'StafPendampingId' => $validatedData['stafpendamping']
]);
$klien->save();
return redirect('/kliens')->with('success', 'Data klien berhasil diperbaharui.');
}
Solution 2:[2]
It turns out that I have to create a resource controller for the update()
. Previously, I did it within a non-resource controller. I think that's the problem. I have created my resource controller and my update works now.
I should avoid doing update()
without a non-resource controller.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | richardec |