Salvando linhas de usuário e detalhes com Cake 2.4.5
-
20-12-2019 - |
Pergunta
Sou muito novo em bolo e queria saber como seria capaz de criar um novo usuário e também criar os dados de contato
banco de dados é assim
Usuários
- ID do usuário
- contact_detail_id
- senha
- role_id
- nome de usuário
Detalhes do contato
- contact_detail_id
- Endereço 1
- Endereço 2
e muitos outros campos
No modelo User atribuí public $hasOne = array('ContactDetail');
Como o usuário terá um contactdetail
Agora, o que preciso saber é como isso seria salvo no método add, já que muitos disseram usar o saveassociated, embora isso não pareça estar funcionando.
A visualização de adição é assim e, pelo que entendi, isso está correto
<?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')); ?>
Solução
Por favor, veja a explicação de Arun sobre o que colocar em seu modelo primeiro e então, você pode usar $this->User->saveAll()
;ou $this->User->saveAssociated();
para salvar as duas tabelas ao mesmo tempo.
Se você deseja salvar o ContactDetail primeiro e depois salvar o usuário, você pode fazer esta segunda opção, mas não é recomendada.
$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);`
Mas prefiro a primeira opção, tentar novamente a primeira opção,
Observação:Certifique-se de que o relacionamento ContactDetail e User esteja presente no modelo como este no modelo de usuário
public $hasOne= array(
'ContactDetail' => array(
'className' => 'ContactDetail',
'foreignKey' => 'contact_detail_id'
)
);
Espero que ajude.
Outras dicas
Na primeira olhada em seu banco de dados, você deve usar a seguinte estrutura de banco de dados, isso o ajudará em mais direções:
User Model
id
username
password
role_id
ContactDetail Model
id
user_id
address1
address2
Definir hasMany
modelo de relacionamento no User
Modelo com ContactDetail
como:
$hasMany => array('ContactDetail');
Agora preencha uma série de detalhes de contato com (id => address1)
emparelhar usando:
$this->ContactDetail->find('list', array('conditions' => array('user_id' => $user_id)),
'fields' => array('ContactDetail.id', 'ContactDetail.address1')));
Agora, para salvar detalhes associados, use Método SalvarAssociado.