独特的规则,当主键的名称列不是ID
我有尝试laravel 5.2框架,我的功课,但我有这样一个错误,当我试图更新连接数据独特的规则,当主键的名称列不是ID
QueryException .PHP线729:SQLSTATE [42S22]:柱未找到:1054未知列 'ID' 在 'where子句'(SQL:SELECT COUNT(*)作为从
siswa
其中nisn
= 1211和id
<> 14聚集体)
在我的表格更新中,我使用了像这样的验证方法
@if (isset($siswa))
{!! Form::hidden('id_siswa',$siswa->id_siswa) !!}
@endif
@if ($errors->any())
<div class="form-group {{ $errors->has('nisn') ? 'has-error':'has-success' }} ">
@else
<div class="form-group">
@endif
{!!Form::label('nisn','NISN:', ['class'=>'control-label'])!!}
{!!Form::text('nisn',null,['class'=>'form-control'])!!}
@if ($errors->has('nisn'))
<span class="help-block"> {{ $errors->first('nisn') }} </span>
@endif
</div>
...
...
<div class="form-group">
{!!Form::submit($submitButtonText,['class'=>'btn btn-primary form-control'])!!}
</div>
的“NISN”字段必须唯一,所以在我的控制,我有这样的
public function update($id_siswa, Request $request)
{
$siswa = Siswa::findOrFail($id_siswa);
$input = $request->all();
$validator = Validator::make($input, [
'nisn' => 'required|string|size:4|unique:siswa,nisn,'.$request->input('id_siswa'),
'nama_siswa' => 'required|string|max:30',
'tanggal_lahir'=> 'required|date',
'jenis_kelamin' => 'required|in:L,P',
]);
if($validator->fails()) {
return redirect('siswa/'.$id_siswa.'/edit')
->withInput()
->withErrors($validator);
}
$siswa->update($request->all());
return redirect('siswa');
}
更新方法在我的表siswa我的主键是id_siswa,没有ID,我都加在我模型以通知我的主要不是ID,这样
protected $primaryKey = 'id_siswa';
我试图改变这样的验证规则在我的控制器
'nisn' => 'required|string|size:4|unique:siswa,nisn,NULL,'.$request->input('id_siswa'),
错误消失了,但是当我更新我的表单中的其他字段(而不是nisn字段)时,验证给我错误,说明我的nisn不是唯一的,我希望当我更新表单中的其他字段(而不是nisn字段)验证将忽略nisn中唯一的规则,当我更新nisn时,验证将检查nisn是否被使用。 Sory为我的英语,我希望有人能给我解决方案。
在Laravel 5.2中有一个更好的方法来验证您的数据。 我建议这样使用验证:如果您使用验证像我上面提到的
$this->validate($request, [
'field' => 'rules',
]);
,你并不需要在你的代码部分如下所示了,因为Laravel将自动为您重定向回。
if($validator->fails()) {
return redirect('siswa/'.$id_siswa.'/edit')
->withInput()
->withErrors($validator);
}
除此之外,发生的问题是因为您正在使用$request->input('id_siswa')
。我想你检查出the validation rules,但不明白。
我会尽力向你解释清楚。唯一的规则有一个选项,可以从唯一检查中排除某一行。这可以通过使用逗号将更多选项添加到唯一规则来完成(,
)。
要排除某一行,您需要指定表的id列的值。在你的情况下,你还需要指定表的哪一列是id列。
我想这是你所需要的:
'nisn' => 'required|string|size:4|unique:siswa,nisn,'.$id_siswa.',id_siswa',
如果你想与模型相一致,你也不必硬编码的主键,为@JiFus建议,改用getKeyName
从型号:
'nisn' => 'required|string|size:4|unique:siswa,nisn,'.$id_siswa.',' . $this->getKeyName()
现在只要您可能要更改模型的主键,你并不需要在很多地方解决这个问题。