我有一个包含三个实体的系统:用户,作者和主题。 主题{id}< --->作者{topic_id,user_id}< --->用户{id,name}
Enitity / 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;
实体/ 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;
实体/ 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;
所以你看到有一个像这样的关联路径
主题< --->作者< --->用户
现在我有一个表单来添加新主题。我想在那里显示一个选项字段,其中将填充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,
));
}
这确实填充了具有正确值的字段。但是,当我提交表单时,我收到错误:
捕获致命错误:参数1传递给 ... \ Entity \ Topic :: setAuthors()必须是... \ 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)。
请告知......
答案 0 :(得分:0)
这是因为您的$autors
属性设置器定义为
public function setAuthors(User $author) ...
但是您的属性上有OneToMany关系,而您的表单字段中有multiple = true
,因此必须将setter定义为:
public function setAuthors($authors) ...