example - instalacion cakephp 3
Cake PhP 3 Guardar datos asociados en niveles mĂșltiples (1)
Hola, logré solucionar este problema.
Primero la función de guardar debería ir así:
$user = $users->newEntity($data, [
''associated'' => [''Customers'',''Customers.Contactinfos'',''Customers.Contactinfos.Phones'',''Customers.Contactinfos.Emails'']
]);
$users->save($user);
En segundo lugar, la solicitud debe respetar todos los niveles como este:
Array
(
[customers] => Array
(
[Customer] => Array
(
[name] => test2
[last_name] => test2
[contactinfos] => Array
(
[Contactinfo] => Array
(
[emails] => Array
(
[Email] => Array
(
[address] => [email protected]
)
)
[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] => [email protected]
)
Y mi ctp se ve así:
<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>
Tengo un modelo de datos donde registro un usuario-> cliente-> contactinfo-> email / phone
Cada una de estas son tablas diferentes con los respectivos controladores y todo lo relacionado.
Cuando intento salvar a un usuario, utilizo el siguiente código:
$users = TableRegistry::get(''Users'');
$user = $users->newEntity($data, [
''associated'' => [''Customers''],[''Contactinfos''],[''Phones''],[''Emails'']
]);
$users->save($user);
Pero solo salva al usuario y al cliente.
Este es el dato de solicitud:
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] => [email protected]
)
)
[password] => stackovertest
[phones] => Array
(
[Phone] => Array
(
[number] => stackovertest
)
)
[role_id] => 0
[activation_code] => a026698222d0479252c2712d3d696fbcca8a766d
[tokentime] => 1432141608
[status] =>
[email] => [email protected]
[contactinfos] => Array
(
[contactinfo] => Array
(
)
)
)
Básicamente, la tabla contactinfo tendrá una identificación (autoincrementada en la base de datos) y la identificación del cliente. Y cada correo electrónico y teléfono registrado tendrá la identificación de la información de contacto.
Esta es la información de la matriz $ 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] => [email protected]
)
[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
)
Puede ver que no incluye el objeto contactinfo por lo que no lo guardará.
¿Cómo puedo arreglar esto? ¿O hay una forma diferente de guardar múltiples niveles de datos asociados?