Symfony2: многие ко многим с пользовательской таблицей ссылок - PullRequest
1 голос
/ 20 марта 2012

Я работаю над формой с 3 сущностями:

  • заказ (заказчик)
  • справочная таблица поддержки (idsupport)
  • таблица ссылок (idorder, idsupport)

И когда я пытаюсь выбрать одну или несколько опор, я получаю эту ошибку:

Catchable Fatal Error: Argument 1 passed to Myapp\MyBundle\Entity\PcastCmdsupports::setIdsupports() must be an instance of Myapp\MyBundle\Entity\PcastSupports, instance of Doctrine\Common\Collections\ArrayCollection given, 
called in C:\wamp\www\php\Symfony\vendor\symfony\src\Symfony\Component\Form\Util\PropertyPath.php on line 347 and defined in C:\wamp\www\php\Symfony\src\Myapp\MyBundle\Entity\PcastCmdsupports.php line 62 

Поскольку я уже создал свою таблицу ссылок, я увидел в Интернете, что я могу просто создать 2 отношения «многие к одному» в своей таблице ссылок:

/**
 * @var PcastSupports
 *
 * @ORM\ManyToOne(targetEntity="PcastSupports")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="IDSUPPORTS", referencedColumnName="IDSUPPORTS")
 * })
 */
private $idsupports;

/**
 * @var PcastOrder
 *
 * @ORM\ManyToOne(targetEntity="PcastOrder")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="IDORDER", referencedColumnName="IDORDER")
 * })
 */
private $idorder;

и мои сеттеры и геттеры:

/**
 * Set idsupports
 *
 */
public function setIdsupports(\Myapp\MyBundle\Entity\PcastSupports $idsupports)
{
    $this->idsupports = $idsupports;
}

/**
 * Get idsupports
 *
 */
public function getIdsupports()
{
    return $this->idsupports;
}

/**
 * Set idorder
 *
 */
public function setIdcommande(\Myapp\MyBundle\Entity\PcastOrder $idorder)
{
    $this->idorder = $idorder;
}

/**
 * Get idorder
 *
 */
public function getIdorder()
{
    return $this->idorder;
}

В моей форме заказа я могу выбрать одну или несколько опор, поэтому я создал свою форму следующим образом:

$form_clips = $this->createFormBuilder($cmdclips)
->add('idorder', new CmdsupportsType)
->getForm();

И, наконец, моя форма SupportType:

$builder
    ->add('idsupports', 'entity', array(
    'class'         => 'MyappMyBundle:PcastSupports', 
    'property'      => 'name',
    'expanded'      => true,
    'multiple'      => true,
    'query_builder' => function(EntityRepository $er) 
    {
        return $er->createQueryBuilder('pts')
        ->orderBy('pts.idsupports','ASC');
    },
));

Я не использую коллекцию массивов, поэтому не понимаю проблемы. И проблема произошла во время этого действия:

$form_clips->bindRequest($request);

Большое спасибо за вашу помощь!


Я пытался заставить его работать с отношением «многие ко многим» в простом случае (сущности user, company и user_company), но у меня возникла проблема при попытке добавить компанию к пользователю:

Warning: oci_bind_by_name() [<a href='function.oci-bind-by-name'>function.oci-bind-by-name</a>]: Invalid variable used for bind in C:\wamp\www\php\Promocast\Symfony\vendor\doctrine-dbal\lib\Doctrine\DBAL\Driver\OCI8\OCI8Statement.php line 113

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

array('column' => ':param10', 'variable' => object(PcastCompany), 'type' => '1')

Моя пользовательская сущность (societe = company):

/**
 * @ORM\ManyToMany(targetEntity="PcastSociete", inversedBy="users")
 * @ORM\JoinTable(name="PcastLienusersociete",
 *   joinColumns={@ORM\JoinColumn(name="ImUser_iduser", referencedColumnName="iduser")},
 *   inverseJoinColumns={@ORM\JoinColumn(name="PcastLienusersociete_idsociete", referencedColumnName="idsociete")}
 * )
 */
private $societes;

public function getSocietes()
{
    return $this->societes;
}

public function addSociete(\Myapp\MyBundle\Entity\PcastSociete $societe)
{
    $this->societes[] = $societe;
}

Субъект моей компании:

/**
 * @ORM\ManyToMany(targetEntity="ImUser", mappedBy="societes")
 */
private $users;

public function __construct() {
    $this->users = new \Doctrine\Common\Collections\ArrayCollection();
}

Если у кого-нибудь есть идеи ...

Спасибо

Ответы [ 2 ]

2 голосов
/ 20 марта 2012

У вас не должно быть объекта, представляющего таблицу ссылок.Если вы правильно аннотируете обе ваши сущности, Doctrine сама будет обрабатывать создание таблицы ссылок.

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

http://readthedocs.org/docs/doctrine-orm/en/latest/reference/association-mapping.html?highlight=many%20to%20one#many-to-many-bidirectional

0 голосов
/ 21 марта 2012

Начните с основ.Мне было любопытно кое-что еще о ManyToMany, поэтому я взял ваши сущности в качестве контрольного примера.Перед тем, как погрузиться в формы и тому подобное, убедитесь, что вы можете выполнить простой тестовый пример из командной строки, такой как:

use Zayso\ArbiterBundle\Entity\PcastSociete as Company;
use Zayso\ArbiterBundle\Entity\ImUser       as User;

protected function test1()
{
    $em = $this->getContainer()->get('doctrine.orm.entity_manager');
    $company = new Company();
    $em->persist($company);

    $user = new User();
    $user->addSociete($company);
    $em->persist($user);

    $em->flush();

}

Для сущностей, которые я использовал:

namespace Zayso\ArbiterBundle\Entity;

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

/**
 * @ORM\Entity
 */
class ImUser
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer",name="iduser") 
 * @ORM\GeneratedValue
 */
protected $id;

public function getId()    { return $this->id; }

/**
 * @ORM\ManyToMany(targetEntity="PcastSociete", inversedBy="users")
 * @ORM\JoinTable(name="PcastLienusersociete",
 *   joinColumns={@ORM\JoinColumn(name="ImUser_iduser", referencedColumnName="iduser")},
 *   inverseJoinColumns={@ORM\JoinColumn(name="PcastLienusersociete_idsociete", referencedColumnName="idsociete")}
 * )
 */
private $societes;

public function getSocietes()
{
    return $this->societes;
}

public function addSociete(PcastSociete $societe)
{
    $this->societes[] = $societe;
}
public function __construct() 
{
    $this->societes = new ArrayCollection();
}

}

namespace Zayso\ArbiterBundle\Entity;

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

/**
 * @ORM\Entity
 */
class PcastSociete
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer", name="idsociete") 
 * @ORM\GeneratedValue
 */
protected $id;

public function getId()    { return $this->id; }

/**
 * @ORM\ManyToMany(targetEntity="ImUser", mappedBy="societes")
 */
private $users;

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

Получите вышеуказанную работутогда мы можем перейти к проблеме форм.

...