Guardar filas de usuario y detalles con Cake 2.4.5
-
20-12-2019 - |
Pregunta
Soy muy nuevo en esto y me preguntaba cómo podría crear un nuevo usuario y también crear los datos de contacto.
la base de datos es así
Usuarios
- ID_usuario
- contacto_detalle_id
- contraseña
- Identificación del rol
- nombre de usuario
Detalles de contacto
- contacto_detalle_id
- Dirección 1
- dirección 2
y muchos otros campos
En el modelo de Usuario he asignado public $hasOne = array('ContactDetail');
Dado que el usuario tendrá un detalle de contacto.
Ahora lo que necesito saber es cómo se guardaría esto en el método add, ya que muchos dijeron que se usara saveassociated, aunque esto no parece estar funcionando.
La vista de adición es así y, según tengo entendido, esto es correcto.
<?php echo $this->Form->create('User', array('action' => 'add')); ?>
<fieldset>
<legend><?php echo __('Add User'); ?></legend>
<?php
echo $this->Form->input('User.username');
echo $this->Form->input('User.password');
echo $this->Form->input('roles');
echo $this->Form->input('ContactDetail.name');
echo $this->Form->input('ContactDetail.surname');
echo $this->Form->input('ContactDetail.address1');
echo $this->Form->input('ContactDetail.address2');
echo $this->Form->input('ContactDetail.country');
echo $this->Form->input('ContactDetail.email');
echo $this->Form->input('ContactDetail.fax');
?>
<label>Are you interested in buying property in Malta?</label>
<?php
$interest_buy = array('0'=>'no','1' => 'yes');
echo $this->Form->input('ContactDetail.interest_buy_property',array('type'=>'radio','options'=>$interest_buy,'value'=>'0','legend'=>FALSE));
?>
<label>Are you interested in renting property in Malta?</label>
<?php
$interest_rent = array('0'=>'no','1' => 'yes');
echo $this->Form->input('ContactDetail.interest_rent_property',array('type'=>'radio','options'=>$interest_rent,'value'=>'0','legend'=>FALSE));
echo $this->Form->input('ContactDetail.mobile');
echo $this->Form->input('ContactDetail.phone');
echo $this->Form->input('ContactDetail.postcode');
echo $this->Form->input('ContactDetail.town');
echo $this->Form->input('ContactDetail.newsletter',array('type'=>'checkbox','label'=>'Would you like to register for the newsletter?' ,'checked'=>'1','legend'=>FALSE,));
?>
</fieldset>
<?php echo $this->Form->end(__('Submit')); ?>
Solución
Consulte la explicación de Arun sobre qué poner en su modelo primero y luego puede usar $this->User->saveAll()
;o $this->User->saveAssociated();
para guardar ambas tablas al mismo tiempo.
Si desea guardar ContactDetail primero y luego guardar Usuario, puede hacer esta segunda opción, pero no se recomienda.
$this->User->ContactDetail->create();
$this->User->ContactDetail->save($this->request->data);`
this->request->data['User']['contact_detail_id'] = $this->User->ContactDetail->id`;
$this->User->Create();
$this->User->save($this->request->data);`
Pero prefiero la primera opción, volver a intentar la primera opción,
Nota:Asegúrese de que ContactDetail y la relación de usuario estén en un modelo como este en User Model
public $hasOne= array(
'ContactDetail' => array(
'className' => 'ContactDetail',
'foreignKey' => 'contact_detail_id'
)
);
Espero eso ayude.
Otros consejos
En el primer vistazo a su base de datos, debe utilizar la siguiente estructura de base de datos, esto le ayudará en más direcciones:
User Model
id
username
password
role_id
ContactDetail Model
id
user_id
address1
address2
Definir hasMany
relación modelo en el User
Modelo con ContactDetail
como:
$hasMany => array('ContactDetail');
Ahora complete una serie de detalles de contacto con (id => address1)
emparejar usando:
$this->ContactDetail->find('list', array('conditions' => array('user_id' => $user_id)),
'fields' => array('ContactDetail.id', 'ContactDetail.address1')));
Ahora para guardar los detalles asociados, use Guardar método asociado.