强制忽略字符串主键的验证在 Laravel 8 中不起作用以更新数据

Forcing ignore validation for string Primary Key not working in Laravel 8 to update data

我的 laravel 应用程序需要帮助。我有一个 table 这种结构:

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');
        });

模型是:

protected $primaryKey = 'KlienUIC';
public $incrementing = false;
protected $keyType = 'string';

use HasFactory;

protected $fillable = ['KlienUIC', 'NamaLahir', 'NamaPanggilan', 'TanggalLahir', 'KategoriKlien', 'StafPendampingId'];

我想更新现有数据,但当我不更改 KlienUIC 值时,它一直给我 The klienuic has already been taken. 错误消息。

这是我的更新方法和验证(还有一些其他尝试强制忽略验证,但它们仍然错误):

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.');
    }

我正在使用 Laravel 8.83.10。谢谢大家

the error for ignore 'KlienUIC' column

您正在尝试更新行不通的主键,主键通常不会更新。

此外,您可以使用作为参数注入的模型来更新数据,而不是使用 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();

编辑:

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.');
    }

原来我必须为 update() 创建一个资源控制器。以前,我是在 non-resource 控制器中完成的。我认为这就是问题所在。我已经创建了我的资源控制器,我的更新现在可以工作了。 我应该避免在没有 non-resource 控制器的情况下进行 update()