繁体   English   中英

当主键名称列不是 id 时,Laravel 中验证的唯一规则

[英]Unique rule for validation in Laravel when primary key name column is not id

我已经为我的作业尝试了 Laravel 5.2 框架,但是当我尝试更新数据时出现这样的错误

Connection.php 第 729 行中的 QueryException: 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');
    
}

在我的表 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') 我猜你检查了验证规则,但不明白。

我会尽量向你解释得更清楚。 唯一规则具有从唯一检查中排除特定行的选项。 这可以通过使用逗号 ( , ) 向唯一规则添加更多选项来完成。

要排除某一行,您需要指定表的 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()

现在,无论何时您可能想要更改模型的主键,您都无需在许多地方修复此问题。

所以你对 except 参数是正确的,它是你想要从检查中排除的 id。

并且 idColumn 是可选的,以防您的列不是 id 而是 user_id 例如。 所以你会使用:

'required|unique:users,email,'.$this->id . ',user_id';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM