Pregunta

Tengo la siguiente situación:

Estoy desarrollando una aplicación de direcciones para almacenar los detalles de nuestros clientes.

Tengo la siguiente estructura DB:

Clients hasMany Addresses
Addresses belongsTo Client
Addresses hasMany AddressEmails and AddressPhones

Si alguien ahora agrega un nuevo cliente, su dirección principal con 1 correo electrónico y 1 número de fono se debe guardar.

Eso funciona en parte muy bueno si hago esto en la vista adicional del cliente con el siguiente código y llamo al método saveall en el cliente-controlador:

 <?php
  echo $this->Form->input('client_group_id');
  echo $this->Form->input('company');
  echo $this->Form->input('firstname');
  echo $this->Form->input('lastname');
  echo $this->Form->input('www');
  echo $this->Form->input('Address.0.is_standard', array('type' => 'hidden', 'value' => '1'));
  echo $this->Form->input('Address.0.street');
  echo $this->Form->input('Address.0.zip');
  echo $this->Form->input('Address.0.city');
 ?>

Pero no tengo idea de cómo guardar el correo electrónico y el número de teléfono a través de esta vista. Intenté pensar como direcciones de correo electrónico.0.Email pero eso no funcionó.


Entiendo:

Con la solución publicada de Nik, está funcionando bien, ahora estoy llamando a $ this-> cliente-> dirección-> saveall ($ this-> data) pero tuve que ajustar mi visión adicional como esta:

<?php
    echo $this->Form->input('client_group_id');
    echo $this->Form->input('company');
    echo $this->Form->input('firstname');
    echo $this->Form->input('lastname');
    echo $this->Form->input('www');
    echo $this->Form->input('Address.is_standard', array('type' => 'hidden', 'value' => '1'));
    echo $this->Form->input('Address.street');
    echo $this->Form->input('Address.zip');
    echo $this->Form->input('Address.city');
    echo $this->Form->input('AddressEmail.0.type', array('type' => 'hidden', 'value' => 'Standard'));
    echo $this->Form->input('AddressEmail.0.email');
    echo $this->Form->input('AddressPhone.0.type', array('type' => 'hidden', 'value' => 'Standard'));
    echo $this->Form->input('AddressPhone.0.number');
?>

Como ahora estoy llamando al método saveall ()-desde el modelo de dirección, ¡los ceros ya no son necesarios!

¿Fue útil?

Solución

Guardar datos relacionados con SaveAll () solo funcionará para modelos directamente asociados.

Entonces, básicamente, podría guardar con el cliente SaveAll () (como modelo primario) y direcciones. Correos electrónicos y teléfonos que puede hacer guardando desde el modelo de dirección como:

$this->Client->saveAll($data); //This saves Client and Address
$this->Client->Address->saveAll($data); //This saves Email and Phone

No lo he probado, pero debería funcionar de esta manera. (Suponiendo que sus campos sigan la convención de nombres como:

echo $this->Form->input('Email.0.field');
echo $this->Form->input('Email.1.field');
echo $this->Form->input('Email.2.field');
echo $this->Form->input('Phone.0.number');
echo $this->Form->input('Phone.1.number');
echo $this->Form->input('Phone.2.number');

No estoy seguro de si "atrapará" la identificación de la dirección directamente, pero podría intentarlo.

Otra forma es guardar el modelo de

$this->Client-Address->saveAll($data);

solamente. De esta manera, todos los modelos relacionados se guardarán (según la documentación, ver primero).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top