2016-11-13 10 views
0

hasMany関係を保存する際に問題があるLaravel 5.3広告を使用しています。ピボットテーブルにLaravel One-To-Manyを挿入

私はテーブルに従業員と1対多の関係を持つアクティビティを持っています。つまり、各従業員は多くのアクティビティを実行します。

私はそれは私にエラーを送信associate()を使用して、従業員に対する活動を追加してい:

以下
BadMethodCallException in Builder.php line 2440: 
Call to undefined method Illuminate\Database\Query\Builder::associate() 

は、DBの構造とコードです:

データベースの構造:

employee (1st table) 
– employee_id 
– employee_name 
- created_at 
- updated_at 

activity (2nd table) 
– activity_id 
– activity_name 
- created_at 
- updated_at 

employee_activity (pivot table) 
– employee_activity_employee_id 
– employee_activity_activity_id 

モデルクラス従業員:

class Employee extends Model 
{ 
    protected $table = 'employee'; 
    protected $primaryKey = 'employee_id'; 

    public function activity() { 
     return $this->hasMany('App\Models\Activity', 'employee_activity', 'employee_activity_employee_id', 'employee_id'); 
    } 
} 

モデルクラスの活動:

class Activity extends Model 
{ 
    protected $table = 'activity'; 
    protected $primaryKey = 'activity_id'; 

    public function employee() { 
     return $this->belongsTo('App\Models\Employee', 'employee_activity', 'employee_activity_activity_id' ,'activity_id'); 
    } 
} 

コントローラ:私は私の関係が間違ってここで定義され

public function EmployeeActivityAssociation() 
{ 
    $employee_id = Input::get('employee_id'); 
    $activity_ids = Input::get('activity_id'); // This is an array of activities 
    $employee = Employee::find($employee_id); 
    if (!empty($employee)) { 
     //Adding activity under the employee 
     foreach ($activity_ids as $id) { 
      $activity = Activity::find($id); 
      $employee->activity()->associate($activity); 
      $employee->save(); 
     } 
     return 'Activities asscoiated to employee'; 
    } 
    else { 
     return 'Employee not found'; 
    } 
} 

を持っていますか?

+1

http://stackoverflow.com/questions/19868838/call-to-undefined-method-illuminate-database-query-builderassociateこれはあなたを助けることができます。 –

+1

多かれ少なかれです。 –

答えて

2

リレーションが正しく定義されていません。あなたのテーブル構造を見ることによってそれはmany-to-many関係でなければなりません。

モデルクラスの従業員:

public function activity() { 
    return $this->belongsToMany('App\Models\Activity', 'employee_activity', 'employee_activity_employee_id', 'employee_id'); 
} 

モデルクラスの活動:あなたは1対に固執する場合

public function EmployeeActivityAssociation() 
{ 
    $employee_id = Input::get('employee_id'); 
    $activity_ids = Input::get('activity_id'); // This is an array of activities 
    $employee = Employee::find($employee_id); 
    if (!empty($employee)) { 
     $employee->activity()->attach($activity_ids); 
     return 'Activities asscoiated to employee'; 
    } 
    else { 
     return 'Employee not found'; 
    } 
} 

public function employee() { 
    return $this->belongsToMany('App\Models\Employee', 'employee_activity', 'employee_activity_activity_id' ,'activity_id'); 
} 

SOあなたのコントローラのようにする必要があります多くの場合、テーブルスキーマを次のように変更する必要があります。

テーブルemployee_activityテーブルを削除し、アクティビティテーブルに列employee_idを追加して、one-to-manyに従って関係を定義します。

関連する問題