Symfony ManyToMany具有实体类型

时间:2016-12-29 18:07:36

标签: php entity symfony

我的代码有问题。我有这个错误:

The property "users" in class "Wiki\AdminBundle\Entity\Post" can be defined with the methods "addUser()", "removeUser()" but the new value must be an array or an instance of \Traversable, "Wiki\AdminBundle\Entity\User" given. 

我不明白我的代码发生了什么。

这是我的FormType:

<?php

namespace Wiki\AdminBundle\Form;

use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Tests\Fixtures\Entity;
use Wiki\AdminBundle\Entity\Post;

class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('users', EntityType::class, [
                'class' => 'WikiAdminBundle:User',
                'choice_label' => 'username',
            ])
            ->add('status')
            ->add('save', SubmitType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Post::class,
        ]);
    }
}

这是我的帖子实体:

<?php

namespace Wiki\AdminBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Wiki\AdminBundle\Traits\Entity as EntityTraits;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity
 * @ORM\Table(name="post")
 * @ORM\Entity(repositoryClass="Wiki\AdminBundle\Entity\Repository\PostRepository")
 * @ORM\HasLifecycleCallbacks
 */
class Post
{
    use EntityTraits\IdTrait;
    use EntityTraits\DateCreated;

    /**
     * @ORM\Column(name="title", type="text")
     */
    private $title;

    /**
     * @ORM\ManyToMany(targetEntity="Wiki\AdminBundle\Entity\User", mappedBy="posts", cascade={"persist"})
     * @ORM\Column(name="author", type="text")
     */
    private $users;

    /**
     * @ORM\Column(name="status", type="integer")
     */
    private $status;

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

    /**
     * @return mixed
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * @param mixed $title
     */
    public function setTitle($title)
    {
        $this->title = $title;
    }

    /**
     * @return mixed
     */
    public function getStatus()
    {
        return $this->status;
    }

    /**
     * @param mixed $status
     */
    public function setStatus($status)
    {
        $this->status = $status;
    }

    public function addUser(User $user)
    {
        $this->users->add($user);
        $user->addPost($this);
    }

    public function removeUser(User $user)
    {
        $this->users->removeElement($user);
    }

    /**
     * @return mixed
     */
    public function getUsers()
    {
        return $this->users;
    }
}

有人可以帮我解决我的问题吗?

最好的问候,

1 个答案:

答案 0 :(得分:1)

在数据表中存储数据时需要数组,但是您已经传递了user个对象。在表单构建器中为&#39; users`添加'multiple' => true

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('title')
        ->add('users', EntityType::class, [
            'class' => 'WikiAdminBundle:User',
            'multiple' => true,
            'choice_label' => 'username',
        ])
        ->add('status')
        ->add('save', SubmitType::class)
    ;
}

注意: 'multiple' => true将创建数组类型控件而不是对象。

Ref Here