Php 使用自定义查询生成器的多个实体的Symfony表单

Php 使用自定义查询生成器的多个实体的Symfony表单,php,mysql,symfony,symfony-forms,dql,Php,Mysql,Symfony,Symfony Forms,Dql,错误消息如下所示: // ... /** * @var string * * @ORM\Column(name="name", type="string", length=255) * @Gedmo\Versioned */ private $name; /** * @ORM\ManyToMany(targetEntity="Town", inversedBy="events") * @ORM\JoinTable(name="Events_to_Towns") **/ pri

错误消息如下所示:

// ...

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

/**
 * @ORM\ManyToMany(targetEntity="Town", inversedBy="events")
 * @ORM\JoinTable(name="Events_to_Towns")
 **/
private $towns;

/**
 * @ORM\OneToMany(targetEntity="Activity", mappedBy="event")
 */
private $activitys;

// ...
// ...

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

/**
 * @ORM\ManyToMany(targetEntity="Event", mappedBy="towns")
 */
private $events;

/**
 * @ORM\OneToMany(targetEntity="Activity", mappedBy="town")
 */
private $activitys;

// ...
// ...

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

/**
 * @ORM\ManyToOne(targetEntity="Town", inversedBy="activitys")
 * @ORM\JoinColumn(name="town_id", referencedColumnName="id")
 */
private $town;

/**
 * @ORM\ManyToOne(targetEntity="Event", inversedBy="activitys")
 * @ORM\JoinColumn(name="event_id", referencedColumnName="id")
 */
private $event;

// ...
[语义错误]第0行,第58列,靠近“事件=:事件ID”: 错误:路径表达式无效。StateFieldPathExpression或 应为SingleValuedAssociationField

这是正确的,因为它是一个带有联接表的
manytomy
join。但我必须如何加载这些实体

问题在活动表单中(最后)。我尝试加载分配了
manytomy
的城镇,将其加入到特定事件中。 代码显示超过1000个单词,所以请看(:

因此,我在Symfony应用程序中有三个实体。
事件
城镇
活动

事件
如下所示:

// ...

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

/**
 * @ORM\ManyToMany(targetEntity="Town", inversedBy="events")
 * @ORM\JoinTable(name="Events_to_Towns")
 **/
private $towns;

/**
 * @ORM\OneToMany(targetEntity="Activity", mappedBy="event")
 */
private $activitys;

// ...
// ...

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

/**
 * @ORM\ManyToMany(targetEntity="Event", mappedBy="towns")
 */
private $events;

/**
 * @ORM\OneToMany(targetEntity="Activity", mappedBy="town")
 */
private $activitys;

// ...
// ...

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

/**
 * @ORM\ManyToOne(targetEntity="Town", inversedBy="activitys")
 * @ORM\JoinColumn(name="town_id", referencedColumnName="id")
 */
private $town;

/**
 * @ORM\ManyToOne(targetEntity="Event", inversedBy="activitys")
 * @ORM\JoinColumn(name="event_id", referencedColumnName="id")
 */
private $event;

// ...
城镇
如下所示:

// ...

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

/**
 * @ORM\ManyToMany(targetEntity="Town", inversedBy="events")
 * @ORM\JoinTable(name="Events_to_Towns")
 **/
private $towns;

/**
 * @ORM\OneToMany(targetEntity="Activity", mappedBy="event")
 */
private $activitys;

// ...
// ...

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

/**
 * @ORM\ManyToMany(targetEntity="Event", mappedBy="towns")
 */
private $events;

/**
 * @ORM\OneToMany(targetEntity="Activity", mappedBy="town")
 */
private $activitys;

// ...
// ...

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

/**
 * @ORM\ManyToOne(targetEntity="Town", inversedBy="activitys")
 * @ORM\JoinColumn(name="town_id", referencedColumnName="id")
 */
private $town;

/**
 * @ORM\ManyToOne(targetEntity="Event", inversedBy="activitys")
 * @ORM\JoinColumn(name="event_id", referencedColumnName="id")
 */
private $event;

// ...
活动
如下所示:

// ...

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

/**
 * @ORM\ManyToMany(targetEntity="Town", inversedBy="events")
 * @ORM\JoinTable(name="Events_to_Towns")
 **/
private $towns;

/**
 * @ORM\OneToMany(targetEntity="Activity", mappedBy="event")
 */
private $activitys;

// ...
// ...

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

/**
 * @ORM\ManyToMany(targetEntity="Event", mappedBy="towns")
 */
private $events;

/**
 * @ORM\OneToMany(targetEntity="Activity", mappedBy="town")
 */
private $activitys;

// ...
// ...

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

/**
 * @ORM\ManyToOne(targetEntity="Town", inversedBy="activitys")
 * @ORM\JoinColumn(name="town_id", referencedColumnName="id")
 */
private $town;

/**
 * @ORM\ManyToOne(targetEntity="Event", inversedBy="activitys")
 * @ORM\JoinColumn(name="event_id", referencedColumnName="id")
 */
private $event;

// ...
这一切都正常。但是问题出在
活动
的表单中,当我要分配一个
城镇
或多个城镇时。我尝试只加载映射到事件的城镇

// ...

public function __construct($eventId) {
    $this->_eventId = $eventId;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $eventId = $this->_eventId;

    $builder
        // ...

        // this work's as expected!
        ->add('category', 'entity', array(
            'required'      => true,
            'label'         => 'Kategorie',
            'class'         => 'FooEventBundle:Category',
            'property'      => 'name',
            'query_builder' => function(\Foo\EventBundle\Entity\CategoryRepository $er) use ($eventId) {
                return $er->createQueryBuilder('c')
                    ->select('c')
                    ->where('c.event = :eventId')
                    ->setParameter('eventId', $eventId)
                ;
            }
        ))

        // here's the problem!
        ->add('town', 'entity', array(
            'required'      => true,
            'label'         => 'Stadt',
            'class'         => 'FooEventBundle:Town',
            'property'      => 'name',
            'query_builder' => function(\Foo\EventBundle\Entity\TownRepository $er) use ($eventId) {
                return $er->createQueryBuilder('t')
                    ->select('t')
                    ->where('t.events = :eventId')
                    ->setParameter('eventId', $eventId)
                ;
            }
        ))

        // ...

    ;
}

// ...
比如:

            $er->createQueryBuilder('t')
            ->select('t')
            ->join('t.events', 'e')
            ->where('e.id = :eventId')
            ->setParameter('eventId', $eventId)

应该行。

正是我要找的。谢谢