1

我有一个包含三个实体的系统:用户、作者和主题。主题 {id}<---> 作者{topic_id,user_id} <---> 用户 {id,name}

实体/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;

实体/主题.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;

实体/用户.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;

如您所见,有这样的关联路径

主题 <---> 作者 <---> 用户

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

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

这确实会使用正确的值填充该字段。但是,当我提交表单时出现错误:

可捕获的致命错误:传递给 ...\Entity\Topic::setAuthors() 的参数 1 必须是 ...\Entity\User 的实例,给定的 Doctrine\Common\Collections\ArrayCollection 的实例,在 /var/www 中调用/Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/Util/PropertyPath.php 在第 538 行并在 .../Entity/Topic.php 第 192 行定义

而且我确实理解我传递了不正确的论点,但我不知道如何解决这个问题。我需要从实体 User 中获取用户名的原则,将其放入字段中,将 id 与名称相关联,一旦我提交表单,它必须引用方法 Topic.addAuthors($ids)。

请指教...

4

1 回答 1

0

这是因为您有$autors定义为的属性设置器

public function setAuthors(User $author) ...

但是您的属性和multiple = true表单字段具有 OneToMany 关系,因此必须将 setter 定义为:

public function setAuthors($authors) ...
于 2012-12-08T18:17:24.237 回答