2016-11-28 49 views
0

我有嘗試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爲我的英語,我希望有人能給我解決方案。

回答

0

在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', 
0

如果你想與模型相一致,你也不必硬編碼的主鍵,爲@JiFus建議,改用getKeyName從型號:

'nisn' => 'required|string|size:4|unique:siswa,nisn,'.$id_siswa.',' . $this->getKeyName()

現在只要您可能要更改模型的主鍵,你並不需要在很多地方解決這個問題。

相關問題