2016-11-07 110 views
0

我知道有一堆关于laravel完整性约束违规的问题,但它们中没有一个是多对多关系,这是我的情况。基本上我有一张桌子霍比(爱好)和桌子西斯瓦(学生),而且这种关系是多对多的,因为一个学生可以有很多兴趣爱好,并且一个兴趣爱好可以被很多学生所青睐。因此,这里是代码:Laravel:完整性约束违规:1452无法添加或更新子行:外键约束失败 - 多对多关系

这是我的模型HOBI:

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Hobi extends Model 
{ 
    protected $table = 'hobi'; 

    protected $fillable = [ 
     'nama_hobi', 
    ]; 

    public function siswa(){ 
     return $this->belongsToMany('App\Siswa', 'hobi_siswa', 'id_hobi', 'id_siswa'); 
    } 
} 

模型Siswa:

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Siswa extends Model 
{ 
    protected $table = 'siswa'; 

    protected $fillable = [ 
     'nisn', 
     'nama_siswa', 
     'tgl_lahir', 
     'jns_klmin', 
     'id_kelas', 
     'id_hobi', 
    ]; 

    public function hobi(){ 
    return $this->belongsToMany('App\Hobi', 'hobi_siswa', 'id_siswa', 'id_hobi')->withTimeStamps(); 
} 
} 

含有HOBI一块表单视图代码:

@if($errors->any()) 
    <div class="form-group {{$errors->has('hobi') ? 'has-error' : 'has-success'}}"> 
@else 
    <div class="form-group"> 
@endif 
     {!! Form::label('hobi', 'Hobi:', ['class'=>'control-label']) !!} 
     @if(count($hobi_list) > 0) 
      @foreach($hobi_list as $key => $value) 
       <div class="checkbox"> 
        <label>{!! Form::checkbox('hobi[]', $value, null) !!}{{$value}}</label> 
       </div> 
      @endforeach 
     @else 
      <p>Tidak ada pilihan hobi.</p> 
     @endif 
    </div> 

最后控制器:

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 

use App\Http\Requests; 

use App\Siswa; 
use App\Telepon; 
use App\Kelas; 
use App\Hobi; 

use Validator; 

class SiswaCont extends Controller 
{ 
    public function siswa(){ 
     $siswa_list = Siswa::orderBy('nama_siswa', 'asc')->paginate(10); 
     $jmlh_siswa = Siswa::count(); 
     return view('siswa.ssw', compact('siswa_list', 'jmlh_siswa')); 
    } 

    public function create(){ 
     $kelas_list = Kelas::lists('nama_kelas', 'id'); 
     $hobi_list = Hobi::lists('nama_hobi', 'id'); 
     return view('siswa.create', compact('kelas_list', 'hobi_list')); 
    } 

    public function store(Request $request){ 
     $input = $request->all(); 

     $validator = Validator::make($input, [ 
      'nisn'=>'required|string|size:4|unique:siswa,nisn', 
      'nama_siswa'=>'required|string|max:30', 
      'tgl_lahir'=>'required|date', 
      'jns_klmin'=>'required|in:L,P', 
no_telepon'=>'sometimes|numeric|digits_between:10,15|unique:telepon,no_telepon', 
      'id_kelas'=>'required', 
     ]); 

     if ($validator->fails()) { 
      return redirect('siswa/create')->withInput()- >withErrors($validator); 
    } 

     $siswa = Siswa::create($input); 

     $siswa->hobi()->attach($request->input('hobi')); 

     return redirect('siswa'); 
    } 
} 

我使用数据透视表hobi_siswa包含id_siswa和id_hobi,创建一个桥梁。 Hobi本身在窗体视图中是复选框建模的。问题在于约束,另一列(nisn,nama_siswa,telepon等)的数据Siswa被保存,但Hobi没有。任何帮助赞赏。

回答

1

使用sync方法而不是attach它接受一个数组。

Docs

同步方法接受ID数组到中间表放置。任何不在给定数组中的ID都将从中间表中删除。因此,完成此操作后,只有给定数组中的ID将存在于中间表中。

例如:

$user->roles()->sync([1, 2, 3]); 
+0

这是短暂的,但它不是链接而已,它明确规定了什么,甚至没有做链接。 –

相关问题