2015-06-02 2 views
4

У меня есть модель пользователей, которая имеет отношение hasOne к модели Employees. Когда я сохраняю пользователя, я также добавляю запись в таблицу Employees с user_id. Это прекрасно работает.cakephp 3 связанный с несколькими уровнями сбережения

Сотрудник может быть связан с классом toMany Courses через CoursesEmployees. Это экономит ок, когда я сохраняю только сотрудников.

Моя проблема заключается в том, что я хочу сохранить все 3 три, но курсы не сохраняются.

Сохранить пользователя -> сохранить сотрудника с новым user_id -> сохранить курсы, выбранные для нового сотрудника с employee_id в courses_employees

EmployeesTable.php

public function initialize(array $config) 
{ 
    $this->table('employees'); 
    $this->displayField('name'); 
    $this->primaryKey('id'); 
    $this->addBehavior('Timestamp'); 
    $this->belongsTo('Users', [ 
     'foreignKey' => 'user_id', 

    ]); 
    $this->belongsTo('Hotels', [ 
     'foreignKey' => 'hotel_id', 
     'joinType' => 'INNER' 
    ]); 
    $this->belongsToMany('Courses', [ 
     'foreignKey' => 'employee_id', 
     'targetForeignKey' => 'course_id', 
     'joinTable' => 'courses_employees' 
    ]); 
} 

пользователи add.ctp:

<?= $this->Form->create($user) ?> 
<fieldset> 
    <legend><?= __('Add User') ?></legend> 
    <?php 
     echo $this->Form->input('role_id', ['options' => $roles, 'empty' => true]); 
     echo $this->Form->input('email'); 
     echo $this->Form->input('active'); 
     echo $this->Form->input('activation_key'); 
     echo $this->Form->input('password'); 
     echo $this->Form->input('employee.name'); 
     echo $this->Form->input('employee.email'); 
     echo $this->Form->input('employee.surname'); 
     echo $this->Form->input('employee.employee_num'); 
     echo $this->Form->input('employee.courses._ids', ['options' => $courses]); 
    ?> 
</fieldset> 
<?= $this->Form->button(__('Submit')) ?> 
<?= $this->Form->end() ?> 

Вот данные, отправленные в метод добавления для сохранения. При этом пользователь и сотрудник будут правильно сохранены, но не будут восстановлены в курсах.

Если я сохраняю форму сотрудника, то сотрудник-диспетчер курсов добавляет ok, поэтому я знаю, что ассоциации настроены нормально.

[ 
'role_id' => '1', 
'email' => '[email protected]', 
'active' => '11111111111', 
'activation_key' => '1', 
'password' => 'asdasdadasdasdasda', 
'employee' => [ 
    'name' => 'asdasdasdasd', 
    'email' => 'asdasdasd2dasd.com', 
    'surname' => 'asdasdads', 
    'employee_num' => 'asdasdadasdas', 
    'courses' => [ 
     '_ids' => [ 
      (int) 0 => '2' 
     ] 
    ] 
] 
] 

UserController.php

public function add() 
{ 
    $this->loadModel('Courses'); 
    $user = $this->Users->newEntity(); 
    if ($this->request->is('post')) { 
     $user = $this->Users->patchEntity($user, $this->request->data, [ 
      'associated' => ['Employees', 'Courses'] 
     ]); 
     if ($this->Users->save($user)) { 
      $this->Flash->success(__('The user has been saved.')); 
      return $this->redirect(['action' => 'index']); 
     } else { 
      $this->Flash->error(__('The user could not be saved. Please, try again.')); 
     } 
    } 
    $roles = $this->Users->Roles->find('list', ['limit' => 200]); 
    $courses = $this->Courses->find('list', ['limit' => 200]); 
    $this->set(compact('user', 'roles', 'courses')); 
    $this->set('_serialize', ['user']); 
} 

ответ

11

Я нашел решение. Я снова прочитал поваренную книгу, и я заметил в одном из примеров фрагменты 'associated' => ['Tags', 'Comments.Users']

Я применил это к моему контроллеру, и теперь он работает. Он экономит на всех уровнях.

$user = $this->Users->patchEntity($user, $this->request->data, [ 
    'associated' => ['Employees', 'Employees.Courses'] 
]); 
+2

Большое спасибо ... много искал для этого .. – Muthu

+1

спас мой день! большое спасибо – ksno

Смежные вопросы