'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

the error for ignore 'KlienUIC' column



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