symfony2 doctrine FormType-使用另一个实体的值填充选择字段

symfony2 doctrine FormType-使用另一个实体的值填充选择字段,symfony,doctrine,associations,entity,Symfony,Doctrine,Associations,Entity,我有一个包含三个实体的系统:用户、作者和主题。 主题{id}作者{Topic\u id,user\u id}用户{id,name} entity/Author.php class Author { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\OneToOne(targetEntity="User", inversedBy="Authors") * @ORM\JoinColumn(name="

我有一个包含三个实体的系统:用户、作者和主题。 主题{id}作者{Topic\u id,user\u id}用户{id,name}

entity/Author.php

class Author
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\OneToOne(targetEntity="User", inversedBy="Authors")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user_id;

    /**
     * @ORM\ManyToOne(targetEntity="Topic")
     * @ORM\JoinColumn(name="topic_id", referencedColumnName="id")
     */
    protected $topic_id;
Entity/Topic.php

/**
 * @ORM\Entity(repositoryClass="my\myBundle\Repository\TopicRepository")
 * @ORM\Table(name="topic")
 * @ORM\HasLifecycleCallbacks()
 */
class Topic
{
    public function __construct()
    {
        $this->author = new ArrayCollection();
        $this->setStartDate(new \DateTime());
    }
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
     /**
     * @ORM\Column(type="integer")
     */
    protected $state = '0';
     /**
     * @ORM\Column(type="string", length=250)
     */
    protected $subject;
     /**
     * @ORM\Column(type="string", length=300, nullable=true)
     */
    protected $comment;
    /**
    * @ORM\OneToMany(targetEntity="Author", mappedBy="topic_id")
    */
    protected $authors;
Entity/User.php

/**
 * @ORM\Entity(repositoryClass="my\myBundle\Repository\UserRepository")
 * @ORM\Table(name="users")
 */
class User
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\OneToOne(targetEntity="Author", inversedBy="user_id")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $id;
如你所见,有这样一个关联路径

主题作者用户

现在我有了一个表格来添加新主题。我想在那个里显示一个选项字段,其中将填充用户表中的名称。 我是这样做的:

class TopicType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder->add('subject')
            ->add('authors', 'entity', array(
                'class' => 'MyBundle:User',
                'query_builder' => function($repository) { return $repository->createQueryBuilder('p'); },
                'property' => 'name',
                'multiple' => true,
                ));
    }
这确实使用正确的值填充字段。但是,当我提交表单时,我收到一个错误:

可捕获致命错误:参数1传递给 …\Entity\Topic::setAuthors必须是…\Entity\User的实例, 给定的条令\Common\Collections\ArrayCollection实例,称为 在里面 /var/www/Symfony/vendor/Symfony/Symfony/src/Symfony/Component/Form/Util/PropertyPath.php 第538行,并在…/Entity/Topic.php第192行中定义

我知道我传递了错误的论点,但我不知道如何解决这个问题。 我需要该原则从实体用户获取用户名,将其放入字段中,将ID与名称关联,一旦我提交表单,它必须引用方法主题。addAuthors$ids

请告知…

这是因为您有$autors属性setter,其定义如下

public function setAuthors(User $author) ...
但属性上有OneToMany关系,表单字段中有multiple=true,因此setter的定义必须如下所示:

public function setAuthors($authors) ...

我按照建议做了更改,但错误消息现在不同了:在关联my\myBundle\entity\Topicauthors上找到了类型为Doctrine\Common\Collections\ArrayCollection的实体,但希望我的\myBundle\entity\Author有任何想法..?Author.php Topic.php User.php