2017-12-06 7 views
1

私はこのような問題を抱えています。今日このコードに関連する別の質問をします。この問題は解決しました。多対多リレーションシップ定義で問題を解決するにはどうすればいいですか

public function addSubject(Request $request){ 
     $student=User::find($request->invisible); 
     $classsubjects = $request['classsubjects']; 
     $student->classSubjects()->attach($classsubjects); 
     return redirect()->route('users.index') 
      ->with('flash_message', 
      'User successfully added.'); 
} 

ここでは、ClassSubject ModelとUserモデル定義の定義を挙げています。

<?php 

namespace App; 

use Illuminate\Notifications\Notifiable; 
use Illuminate\Foundation\Auth\User as Authenticatable; 
use Spatie\Permission\Traits\HasRoles; 

class User extends Authenticatable 
{ 
    use Notifiable; 
    use HasRoles; 

    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = [ 
     'name', 'email', 'password','language' 
    ]; 

    /** 
    * The attributes that should be hidden for arrays. 
    * 
    * @var array 
    */ 
    protected $hidden = [ 
     'password', 'remember_token', 
    ]; 

    public function setPasswordAttribute($password) 
    { 
     $this->attributes['password'] = bcrypt($password); 
    } 

    public function classSubject() 
    { 
     return $this->hasMany('App\ClassSubject'); 
    } 

    public function classSubjects() 
    { 
     return $this->belongsToMany('App\ClassSubject'); 

    } 


} 

これは私のclassSubjectモデルです。

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class ClassSubject extends Model 
{ 
    protected $fillable = [ 
     'class_room_id','subject_id','teacher_id' 
    ]; 

    public function classRoom() 
    { 
     return $this->belongsTo('App\ClassRoom','class_room_id','id'); 
    } 

    public function subject() 
    { 
     return $this->belongsTo('App\Subject','subject_id','id'); 
    } 

    public function teacher() 
    { 
     return $this->belongsTo('App\User','teacher_id','id'); 
    } 


    public function students() 
    { 
     return $this->belongsToMany('App\User'); 

    } 






} 

これは私が得ているエラーです。

Illuminate \ Database \ QueryException (42S02) 
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'lcurve.class_subject_user' doesn't exist (SQL: insert into `class_subject_user` (`class_subject_id`, `user_id`) values (3, 4), (1, 4)) 

エラーメッセージのようにテーブルを作成する必要がありますか。

+0

'ClassSubject'と' User'間のピボットテーブルの名前は何ですか?そのモデルを投稿できますか? – Laerte

+0

中間のピボットテーブルを切断する必要がありますか? –

+0

はい。 belongsToMany relationshinpを持つには、ピボットテーブルが必要です。私は答えとして例を掲示します。 – Laerte

答えて

0

これを処理するには、ピボットテーブルを作成する必要があります。例:

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class ClassSubjectUser extends Model 
{ 
    protected $fillable = [ 
     'class_subject_id','user_id' 
    ]; 

    protected $table = 'class_subject_user'; 
} 

次に、関係を定義するときに、テーブルとキーの名前を設定する必要があります。 Userモデルで

:ClassSubjectモデルで

public function classSubjects() 
{ 
    return $this->belongsToMany('App\ClassSubject', 'class_subject_user', 'class_subject_id', 'user_id'); 
} 

public function students() 
{ 
    return $this->belongsToMany('App\User', 'class_subject_user', 'user_id', 'class_subject_id'); 
} 

これは正しくbelongsToMany関係を設定します。

参考:https://laravel.com/docs/5.5/eloquent-relationships#updating-many-to-many-relationships

関連する問題