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



我需要一个帮助与我的laravel应用程序。我有一个表与此结构:

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'];

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

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

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

我使用Laravel8.83.10。谢谢大家

忽略'KlienUIC'列的错误

你试图更新主键但这行不通,主键通常不会更新

除此之外,您可以使用注入的模型作为参数来更新数据,而不是使用返回QueryBuilderKlien::where()

$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()创建资源控制器。之前,我是在一个非资源控制器中完成的。我想这就是问题所在。我已经创建了我的资源控制器,现在我的更新工作了。我应该避免在没有非资源控制器的情况下执行update()

最新更新