Cake PhP 3 Сохранение связанных данных в кратных уровнях

У меня есть модель данных, в которой я регистрирую адрес пользователя-> клиент-> контактный-> адрес электронной почты / телефон

Каждый из них представляет собой разные таблицы с соответствующими контроллерами и всем, что связано.

Когда я пытаюсь сохранить пользователя, я использую следующий код:

$users = TableRegistry::get('Users'); $user = $users->newEntity($data, [ 'associated' => ['Customers'],['Contactinfos'],['Phones'],['Emails'] ]); $users->save($user); 

Но это только спасает пользователя и клиента.

Это данные запроса:

 Array ( [customers] => Array ( [Customer] => Array ( [name] => stackovertest [last_name] => stackovertest [ssn] => stackovertest [address] => stackovertest [gender] => male [birth] => Array ( [year] => 2015 [month] => 05 [day] => 20 ) ) ) [emails] => Array ( [Email] => Array ( [email] => stackovertest@test.com ) ) [password] => stackovertest [phones] => Array ( [Phone] => Array ( [number] => stackovertest ) ) [role_id] => 0 [activation_code] => a026698222d0479252c2712d3d696fbcca8a766d [tokentime] => 1432141608 [status] => [email] => stackovertest@test.com [contactinfos] => Array ( [contactinfo] => Array ( ) ) ) 

В основном таблица contactinfo будет иметь идентификатор (автоинкремент в базе данных) и идентификатор клиента. И каждый зарегистрированный адрес электронной почты и телефон будет иметь идентификатор контактной информации.

Это данные массива $ user:

 App\Model\Entity\User Object ( [new] => 1 [accessible] => Array ( [email] => 1 [password] => 1 [status] => 1 [activation_code] => 1 [tokentime] => 1 [role_id] => 1 [role] => 1 [customers] => 1 ) [properties] => Array ( [customers] => Array ( [0] => App\Model\Entity\Customer Object ( [new] => 1 [accessible] => Array ( [name] => 1 [last_name] => 1 [ssn] => 1 [gender] => 1 [birth] => 1 [address] => 1 [user_id] => 1 [user] => 1 [aoffers] => 1 [hoffers] => 1 [poffers] => 1 ) [properties] => Array ( [name] => stackovertest [last_name] => stackovertest [ssn] => stackovertest [address] => stackovertest [gender] => male [birth] => Cake\I18n\Time Object ( [time] => 2015-05-20T00:00:00+0000 [timezone] => UTC [fixedNowTime] => ) ) [dirty] => Array ( [name] => 1 [last_name] => 1 [ssn] => 1 [address] => 1 [gender] => 1 [birth] => 1 ) [original] => Array ( ) [virtual] => Array ( ) [errors] => Array ( ) [repository] => Customers ) ) [password] => stackovertest [role_id] => 0 [activation_code] => a026698222d0479252c2712d3d696fbcca8a766d [tokentime] => 1432141608 [status] => [email] => stackovertest@test.com ) [dirty] => Array ( [customers] => 1 [password] => 1 [role_id] => 1 [activation_code] => 1 [tokentime] => 1 [status] => 1 [email] => 1 ) [original] => Array ( ) [virtual] => Array ( ) [errors] => Array ( ) [repository] => Users ) 

Вы можете видеть, что он не включает объект contactinfo, чтобы он не сохранял его.

Как я могу это исправить? Или существует другой способ сохранить несколько уровней связанных данных?

Эй, мне удалось решить эту проблему.

Сначала функция сохранения должна выглядеть следующим образом:

  $user = $users->newEntity($data, [ 'associated' => ['Customers','Customers.Contactinfos','Customers.Contactinfos.Phones','Customers.Contactinfos.Emails'] ]); $users->save($user); 

Во-вторых, запрос должен уважать все уровни:

 Array ( [customers] => Array ( [Customer] => Array ( [name] => test2 [last_name] => test2 [contactinfos] => Array ( [Contactinfo] => Array ( [emails] => Array ( [Email] => Array ( [address] => test2@test.test ) ) [phones] => Array ( [Phone] => Array ( [number] => test2 ) ) ) ) [ssn] => test2 [address] => test2 [gender] => male [birth] => Array ( [year] => 2015 [month] => 05 [day] => 20 ) ) ) [password] => test2 [role_id] => 0 [activation_code] => 91c40a9979fcc564a5f27ff09317d6e2f4fdcd58 [tokentime] => 1432154711 [status] => [email] => test2@test.test ) 

И мой ctp выглядит так:

  <fieldset> <legend><?= __('Add User') ?></legend> <?php echo $this->Form->input('customers.Customer.name'); echo $this->Form->input('customers.Customer.last_name'); echo $this->Form->input('customers.Customer.contactinfos.Contactinfo.emails.Email.address', array('label' => 'Email')); echo $this->Form->input('password'); echo $this->Form->input('customers.Customer.contactinfos.Contactinfo.phones.Phone.number', array('label' => 'Phone')); echo $this->Form->input('customers.Customer.ssn', array('label' => 'Cedula')); echo $this->Form->input('customers.Customer.address'); echo $this->Form->input('customers.Customer.gender', array( 'options' => array('male' => 'Male','female' => 'Female') )); echo $this->Form->input('customers.Customer.birth'); echo $this->Form->input('role_id', ['options' => $roles]); ?> </fieldset>