2016-11-13 4 views
0

Я использую Laravel 5.3 Объявление имеет проблемы с сохранением через отношения hasMany.Вставка Laravel One-To-Many на сводной таблице

У меня есть сотрудник и деятельность таблиц, которая имеет отношение «один ко многим». Каждый сотрудник будет выполнять множество действий.

Когда я добавляю действие против сотрудника, используя associate() это отправить мне сообщение об ошибке:

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

Ниже приведена структура БД и код:

Структура базы данных:

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.

Модель Класс Employee:

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

Модель Класс активности:

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

SO контроллер должен быть как:

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'; 
    } 
} 

Если вы хотите придерживаться взаимно многие отношения, то вам нужно изменить схемы таблиц как:

Удалить таблицу employee_activity таблицу и добавить столбец employee_id в таблицу действий, а затем определить отношение в соответствии с one-to-many.