Отношение «многие к одному»: проблема ArrayCollection

Форма домена

У меня есть отношение «многие к одному» между доменом и сайтом. Но когда я пытаюсь добавить новый домен, я получаю эту ошибку:

Найден объект типа Doctrine\Common\Collections\ArrayCollection в ассоциации Eliophot\BackBundle\Entity\Domain#site, но ожидается Eliophot\BackBundle\Entity\Site

Это мой доменный контроллер:

public function createDomainAction(Request $request)
    {
        $domain = new Domain;

        if (!$domain) {
            throw $this->createNotFoundException('Unable to find Domain entity.');
        }

        $newForm = $this->createForm(new DomainType(), $domain);

        $newForm->handleRequest($request);

        if ($newForm->isValid()) {
            $entityManager = $this->get('doctrine')->getManager();
            $entityManager->persist($domain);
            $entityManager->flush();
            $this->get('session')->getFlashBag()->add('success', 'Le domaine a été crée');

            return $this->redirect($this->generateUrl('domain_list'));
        }

        return $this->render('EliophotBackBundle:Domain:new_domain.html.twig', array(
            'domain'   => $domain,
            'form'   => $newForm->createView(),
        ));
    }

Это мой тип домена:

class DomainType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('domainName','text', array(
                'label' => 'Nom du domaine'
            ))
            ->add('site','entity', array(
                'class' => 'EliophotBackBundle:Site',
                'property' => 'name',
                'label' => 'Sélectionnez un ou plusieurs site(s)',
                'multiple' => true
            ));
    }

    public function getName()
    {
        return 'domain';
    }
...
}

и мой тип сайта:

class SiteType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', 'text', array(
                'label' => 'Nom du site',
                'required' => true
            ))
            ->add('nameBundle', 'text', array(
                'label' => 'Nom du bundle du site',
                'required' => true
            ))
            ->add('numClient', 'integer', array(
                'label' => 'Numéro client du site',
                'required' => true
            ));
    }

    public function getName()
    {
        return 'site';
    }
...
}

Сущность сайта:

/**
 * Site
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Eliophot\BackBundle\Entity\SiteRepository")
 */
class Site
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

    /**
     * @var string
     *
     * @ORM\Column(name="name_bundle", type="string", length=255)
     */
    private $nameBundle;

    /**
     * @var integer
     *
     * @ORM\Column(name="num_client", type="integer")
     */
    private $numClient;

    /**
     * @ORM\OneToMany(targetEntity="Domain", mappedBy="site")
     */
    protected $domains;

    /**
     * Initialisation
     */
    public function __construct()
    {
        $this->domains = new ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Site
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set nameBundle
     *
     * @param $nameBundle
     * @return $this
     */
    public function setNameBundle($nameBundle)
    {
        $this->nameBundle = $nameBundle;

        return $this;
    }

    /**
     * Get nameBundle
     *
     * @return string
     */
    public function getNameBundle()
    {
        return $this->nameBundle;
    }

    /**
     * Set numClient
     *
     * @param integer $numClient
     * @return Site
     */
    public function setNumClient($numClient)
    {
        $this->numClient = $numClient;

        return $this;
    }

    /**
     * Get numClient
     *
     * @return integer 
     */
    public function getNumClient()
    {
        return $this->numClient;
    }

    /**
     * Get domains
     *
     * @return ArrayCollection
     */
    public function getDomains()
    {
        return $this->domains;
    }

    /**
     * Set domains
     *
     * @param ArrayCollection $domains
     */
    public function setDomains(ArrayCollection $domains)
    {
        $this->domains = $domains;
    }
}

Сущность домена:

/**
 * Domain
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Domain
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="domain_name", type="string", length=255)
     */
    private $domainName;

    /**
     * @ORM\ManyToOne(targetEntity="Site", inversedBy="domains")
     * @ORM\JoinColumn(name="site_id", referencedColumnName="id")
     */
    protected $site;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set domainName
     *
     * @param string $domainName
     * @return Domain
     */
    public function setDomainName($domainName)
    {
        $this->domainName = $domainName;

        return $this;
    }

    /**
     * Get domainName
     *
     * @return string 
     */
    public function getDomainName()
    {
        return $this->domainName;
    }

    public function getSite()
    {
        return $this->site;
    }

    public function setSite($site)
    {
        $this->site = $site;

        return $this;
    }
}

Как говорит ошибка, я думаю, что Symfony ожидает объект Site Object, а не arrayCollection... когда я var_dump запрашиваю после добавления, я получаю это для поля сайта (в этом примере я выбрал "site de test 1" и " сайт де тест 2") :

array(2) { [0]=> string(1) "1" [1]=> string(1) "2" }

=> это должно быть добавлено в таблицу доменов 2 новые строки для рассматриваемого домена

Итак, как я могу это сделать?


person TOZ    schedule 29.08.2014    source источник
comment
Можете ли вы показать свои классы сущностей?   -  person sebbo    schedule 29.08.2014
comment
Да, посмотрите, пожалуйста, я редактирую свой ответ, добавляя 2 класса сущностей :)   -  person TOZ    schedule 29.08.2014
comment
И чего вы пытаетесь достичь, так это того, что ОДИН сайт может иметь НЕСКОЛЬКО доменов, верно?   -  person sebbo    schedule 29.08.2014
comment
Да, сайт 1...n домен :)   -  person TOZ    schedule 29.08.2014


Ответы (1)


Кажется, что вы пытаетесь связать объекты наоборот. Ваш интерфейс показывает форму, в которой пользователь может ввести один домен и выбрать сайты, которые должны быть связаны с этим доменом.

С моей точки зрения, вы должны создать форму, в которой пользователь вводит имя сайта и выбирает связанные домены. Только наоборот.

person sebbo    schedule 29.08.2014