2011-09-10 27 views
5

Tengo entidades de usuario y de teléfono con una relación OneToMany entre ellas.Symfony2 Embedded Entities

Mi entidad Usuario:

namespace Project\UserBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* Project\UserBundle\Entity\User 
* 
* @ORM\Table(name="user") 
* @ORM\Entity 
*/ 
class User 
{ 
    /* ..... */ 

    /** 
    * @var Doctrine\Common\Collections\ArrayCollection 
    * 
    * @ORM\OneToMany(targetEntity="Phone", mappedBy="user") 
    */ 
    private $phone; 

    public function __construct() 
    { 
     $this->phone = new ArrayCollection(); 
    } 

    /** 
    * Add phone 
    * 
    * @param Project\UserBundle\Entity\Phone $phone 
    */ 
    public function addPhone(\Project\UserBundle\Entity\Phone $phone) 
    { 
     $this->phone[] = $phone; 
    } 

    /** 
    * Get phone 
    * 
    * @return Doctrine\Common\Collections\Collection 
    */ 
    public function getPhone() 
    { 
     return $this->phone; 
    } 

    /* ..... */ 

} 

Y mi entidad Teléfono:

namespace Project\UserBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Project\UserBundle\Entity\Phone 
* 
* @ORM\Table(name="user_phone") 
* @ORM\Entity 
*/ 
class Phone 
{ 
    /* ..... */ 

    /** 
    * @ORM\ManyToOne(targetEntity="User", inversedBy="phone") 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    */ 
    private $user; 

    /** 
    * @var string $number 
    * 
    * @ORM\Column(name="number", type="string", length=128) 
    */ 
    private $number; 

    /** 
    * Set user 
    * 
    * @param Project\UserBundle\Entity\User $user 
    */ 
    public function setUser(\Project\UserBundle\Entity\User $user) 
    { 
     $this->user = $user; 
    } 

    /** 
    * Get user 
    * 
    * @return Project\UserBundle\Entity\User 
    */ 
    public function getUser() 
    { 
     return $this->user; 
    } 

    /* ..... */ 
} 

He suprimido parte del código para que sea un poco corto, tengo un campo de ID y otros campos extra relacionado con las entidades.

En mi controlador, que estoy haciendo esto:

public function showFormAction($entity) 
{ 
    /* ..... */ 
    $user = new User(); 
    $phone = new Phone(); 
    $user->addPhone($phone); 

    $form = $this->createForm(new UserRegister(), $user); 
    /* ..... */ 
} 

En mi clase de formulario:

class UserRegister extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder->add('email', 'text') 
       ->add('password', 'repeated', array(
          'type' => 'password', 
          'invalid_message' => 'The password fields must match.', 
          'options' => array('label' => 'Password'), 
          'error_bubbling' => false) 
        ) 
       ->add('first_name', 'text') 
       ->add('last_name', 'text') 
       ->add('phone', 'text'); 
    } 

    public function getName() 
    { 
     return 'register'; 
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array(
      'data_class' => 'Project\UserBundle\Entity\User', 
     ); 
    } 

} 

Y en mi plantilla ramita:

<div> 
    {{ form_errors(form.phone) }} 
    {{ form_label(form.phone, null, { 'attr': {'class': 'span-3'} }) }} 
    {{ form_widget(form.phone, { 'attr': {'class': 'text'} }) }} 
</div> 

Lo que estoy intentar hacer básicamente es permitir que un usuario tenga varios números de teléfono, por lo tanto, tiene una relación OneToMany entre el usuario y el teléfono. En mi forma, quiero mostrar el campo "número" de la entidad "Teléfono" en mi formulario y luego agregar un solo registro telefónico al usuario respectivo.

En la actualidad, con el código anterior, la forma es la prestación, pero que muestra:

"Doctrine \ Common \ Collections \ ArrayCollection @ 0000000062cf59cf00000000e32fc883" en el campo Teléfono.

Cambiar 'teléfono' a 'colección' en la clase de formulario resulta en Twig_Runtime_Error "El teléfono no se puede convertir en cadena" 500 error interno del servidor. Intenté representar el teléfono como 'form.phone.number' para obtener el elemento numérico en la entidad Phone, sin embargo, dice:

"Método" número "para el objeto" Symfony \ Component \ Form \ FormView "no existe "

También intenté cambiar el tipo de 'teléfono' en la clase de formulario a 'entidad' y agregué la matriz para reflejar el espacio de nombres de Entidad; sin embargo, siempre mostraría el error" Necesita administrar su Entidad ".

Estoy un poco perdido y no estoy seguro de cómo se supone que debe hacerse, he leído en algún lugar que puedo crear instancias de los objetos de Usuario y Teléfono por separado, realizar los cambios y luego persistir uno por uno. No estoy seguro de si esa es la mejor práctica o no, mi enfoque fue crear un objeto de usuario, agregarle un registro de teléfono y luego persistir el objeto de usuario.

Respuesta

0

Puede evitar que fisplaying la "doctrina \ Common \ Collections \ ArrayCollection @ 0000000062cf59cf00000000e32fc883" mensaje al hacer $ form-> get ('teléfono') -> setData (''); Por lo demás, yo no te puedo ayudar, también me gustaría una respuesta ...

1

Pruebe con

/** 
* @var Doctrine\Common\Collections\ArrayCollection 
* 
* @ORM\OneToMany(targetEntity="Phone", mappedBy="user", cascade={"persist"}) 
*/ 
private $phone; 

Para Symfony Insertar-Form con relación OneToMany, la necesidad añade cascada = { "persisten "} en la anotación