当主键名称列不是 id 时 Laravel 中的唯一验证规则
Unique rule for validation in Laravel when primary key name column is not id
我的功课尝试了Laravel 5.2框架,但是当我尝试更新数据时出现这样的错误
QueryException in Connection.php line 729: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id' in 'where clause' (SQL: select count(*) as aggregate from siswa
where nisn
= 1211 and 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');
}
在我的 table 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。
在 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,但没看懂。
我会尽力向您解释得更清楚。唯一规则有一个选项可以从唯一检查中排除特定行。这可以通过使用逗号 (,
).
向唯一规则添加更多选项来完成
要排除某行,需要指定table的id列的值。在您的情况下,您还需要指定 table 的哪一列是 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()
现在,无论何时您可能想要更改模型的主键,您都不需要在很多地方进行修复。
所以你说的except参数是对的,就是你想排除在检查之外的id。
并且 idColumn 是可选的,以防您的列不是 id,而是 user_id。所以你将使用:
'required|unique:users,email,'.$this->id . ',user_id';
我的功课尝试了Laravel 5.2框架,但是当我尝试更新数据时出现这样的错误
QueryException in Connection.php line 729: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id' in 'where clause' (SQL: select count(*) as aggregate from
siswa
wherenisn
= 1211 andid
<> 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');
}
在我的 table 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。
在 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,但没看懂。
我会尽力向您解释得更清楚。唯一规则有一个选项可以从唯一检查中排除特定行。这可以通过使用逗号 (,
).
要排除某行,需要指定table的id列的值。在您的情况下,您还需要指定 table 的哪一列是 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()
现在,无论何时您可能想要更改模型的主键,您都不需要在很多地方进行修复。
所以你说的except参数是对的,就是你想排除在检查之外的id。
并且 idColumn 是可选的,以防您的列不是 id,而是 user_id。所以你将使用:
'required|unique:users,email,'.$this->id . ',user_id';