2016-11-07 10 views
0

laravel整合性制約違反について質問されている問題はたくさんありますが、Many to Manyそれは私の場合です。基本的に私はテーブルHobi(趣味)とテーブルSiswa(学生)があり、学生は多くの趣味を持つことができ、多くの学生が趣味を好むことができるので、関係は多種多様です。だからここのコードは次のとおりです。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:Hobiを含まフォームビューコードの

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(); 
} 
} 

作品:

@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

attachの代わりにsyncメソッドを使用して配列を受け入れます。

Docs

からの同期方法は、中間テーブル上に配置するIDの配列を受け付けます。指定された配列にないIDは中間テーブルから削除されます。したがって、この操作が完了すると、指定された配列のIDのみが中間テーブルに存在します。例えば

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

これは簡単ですが、それは、それが明確にリンクがなくても何をすべきかを述べているだけで、リンクではありません。 –

関連する問題