Symfony2 Embedded Entities - PullRequest
       11

Symfony2 Embedded Entities

5 голосов
/ 10 сентября 2011

У меня есть сущности Пользователь и Телефон с отношениями OneToMany между ними.

Сущность Мой пользователь:

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;
    }

    /* ..... */

}

А сущность Мой телефон:

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;
    }

    /* ..... */
}

ЯЯ удалил часть кода, чтобы сделать его немного короче, у меня есть поле Id и дополнительные поля, связанные с сущностями.

В моем контроллере я делаю это:

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

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

В моем классе формы:

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',
        );
    }

}

И в моем шаблоне веточки:

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

В основном я пытаюсь разрешить пользователю иметь несколько телефонных номеров,следовательно, имеет отношение OneToMany между пользователем и телефоном.В моей форме я хочу показать поле «номер» сущности «Телефон» в своей форме, а затем добавить отдельную запись телефона соответствующему пользователю.

В настоящее время с указанным выше кодом форма обрабатывается, нопоказывая:

«Doctrine \ Common \ Collections \ ArrayCollection @ 0000000062cf59cf00000000e32fc883» в поле «Телефон».

Изменение «phone» на «collection» в классе формы приводит к Twig_Runtime_Error «Телефон не может быть преобразован в строку» 500 внутренняя ошибка сервера.Я попытался отобразить телефон как «form.phone.number», чтобы получить элемент номера в сущности Phone, однако он говорит:

«Метод» номер »для объекта« Symfony \ Component \ Form \ FormView »не существует "

Я также попытался изменить тип« телефон »в классе формы на« сущность »и добавил массив для отображения пространства имен сущности, однако всегда будет отображаться« Вам необходимо управлять сущностью »"ошибка.

Я немного растерялся и не уверен, как это сделать, я где-то читал, что могу создавать экземпляры объектов User и Phone по отдельности, вносить изменения, а затем сохранять их одинодним.Я не уверен, что это лучший метод или нет, мой подход заключался в создании объекта User, добавлении записи Phone и сохранении объекта User.

Ответы [ 2 ]

1 голос
/ 05 января 2012

Попробуйте с

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

Для встраиваемой формы Symfony с отношением OneToMany необходимо добавить cascade = {"persist"} в аннотацию

0 голосов
/ 08 октября 2011

Вы можете предотвратить отображение сообщения «Doctrine \ Common \ Collections \ ArrayCollection @ 0000000062cf59cf00000000e32fc883», выполнив $ Форма-> Get ( 'телефон') -> УстановитьДанные ( ''); В остальном я не могу вам помочь, я бы тоже хотел получить ответ ...

...