Symfony实体将数组设置为单个实体元素

时间:2016-06-16 08:04:00

标签: arrays collections entity symfony

我有问题,我想将原型数组添加到数据库,但这显示了这个错误:

  

类型" AppBundle \ Entity \ Tag"," array"的预期参数给定

     

...

     

发布 - > setTag(数组(数组('值' =>'测试'),数组('值' =>&#39 ;苔丝')))

这是我的标签制作者:

public function setTag(\AppBundle\Entity\Tag $tag = null)
{
    $this->tag = $tag;

    return $this;
}

我有两个关系实体,这里是关系:

class Post
{
    /**
     * @ORM\ManyToMany(targetEntity="Tag", inversedBy="post")
     * @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
     */
    private $tag;

    public function setTag(\AppBundle\Entity\Tag $tag = null)
    {
        $this->tag = $tag;

        return $this;
    }
}

和标签:

class Tag
{
    /**
     * @ORM\ManyToMany(targetEntity="Post", mappedBy="tag")
     */
    private $post;
}

来源:

  

http://snipet.co.uk/kR

     

http://snipet.co.uk/gcf

     

http://snipet.co.uk/0VI

1 个答案:

答案 0 :(得分:1)

您正在尝试建模Post和Tag之间的双向多对多关系。

所以,首先,你的getter需要返回一个对象集合,你的setter需要接受一个对象集合 - 不仅是代码中的一个对象(你的setTag方法接受Tag类型的参数 - 但你需要一个类似数组的参数。)

其次,Doctrine框架不适用于简单的PHP数组,而是使用\ Doctrine \ Common \ Collections \ Collection的实现。

接下来,您需要使用Collection类的实现初始化实体类的构造函数中的集合字段 - 您可以使用\ Doctrine \ Common \ Collections \ ArrayCollection。

所以你的实体类看起来应该是这样的:

/**
* @ORM\Entity
*/
class Post
{
    /**
    * @ORM\ManyToMany(targetEntity="Tag", inversedBy="posts")
    * @ORM\JoinTable(name="posts_tags")
    */
    private $tags;

    public function __construct()
    {
        $this->tags = new \Doctrine\Common\Collections\ArrayCollection();
    }

    public function getTags()
    {
        return $this->tags;
    }

    public function setTags(\Doctrine\Common\Collections\Collection $tags)
    {
        $this->tags = $tags;
    }
}


/**
* @ORM\Entity
*/
class Tag
{
    /**
    * @ORM\ManyToMany(targetEntity="Post", mappedBy="tags")
    */
    private $posts;

    public function __construct()
    {
        $this->posts = new \Doctrine\Common\Collections\ArrayCollection();
    }

    public function getPosts()
    {
        return $this->posts;
    }

    public function setPosts(\Doctrine\Common\Collections\Collection $posts)
    {
        $this->posts = $posts;
    }

}

我强烈建议您再次阅读Doctrine框架的文档,如何注释您的实体以及如何建模关系:http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/association-mapping.html