doctrine2在数据库中插入arraycollection

时间:2015-09-03 22:35:30

标签: php doctrine-orm zend-framework2

我正在尝试在数据库中插入数组集合。对象之间的关系是 ManyToMany 。所以我想发布一条消息并添加一些主题标签(不只是一个,例如存储在Doctrine 2数组集合中的一些)。没有错误,但对象未链接:(表messageshastags都包含数据,但messages_hastags表为空。

我的代码:

Message.php

/**
 * @ORM\ManyToMany(targetEntity="Application\Entity\Hashtag", mappedBy="messages")
 */
private $hashtags;

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

function getHashtags() {
    return $this->hashtags;
}

function setHashtags($hashtags) {
    $this->hashtags = $hashtags;
}

Hashtag.php

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

/** @ORM\ManyToMany(targetEntity="Application\Entity\Message", inversedBy="hashtags") */
private $messages;

function getMessages() {
    return $this->messages;
}

function setMessages($messages) {
    $this->messages = $messages;
}

Controller.php这样

$hashtag_array = new \Doctrine\Common\Collections\ArrayCollection(); 
$hashtag_array->add(HASHTAG); //here is a for loop adding some entities

$newMessage = \Application\Entity\Message();
$newMessage->setHashtags($hashtag_array);
$em->persist($newMessage);
$em->flush();

该消息将出现在数据库中,但没有指向主题标签的链接。

1 个答案:

答案 0 :(得分:1)

您的映射严重错误。 inversedBymappedBy字段都指向" hashtags"。其中一个甚至还有一个错字(hastags)。

在你的留言中,它应该是mappedBy="messages" 您还需要始终 initialize your collections in the constructor!

所以在Hashtag实体内:

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

我建议先修复所有这些,然后检查问题是否已解决。

更新

你做不到:

$newMessage->setHashtags($hashtag_array);

Doctrine集合不能直接与这样的数组交换。 您必须按照the Doctrine 2 documentation chapter 8. Working with Associations中的说明添加适当的setter和getter方法。在继续使用Doctrine之前,我建议您阅读一些文档。为了使这些事情发挥作用,理解Doctrine internals是很重要的。

这就是Message资源中的内容:

/**
 * Get hashtags
 *
 * @return Collection
 */
public function getHashtags()
{
    return $this->hashtags;
}

/**
 * Add hashtag.
 *
 * @param Hashtag $hashtag
 * @return self
 */
public function addHashtag(Hashtag $hashtag)
{
    $this->hashtags->add($hashtag);
    return $this;
}

/**
 * Add hashtags.
 *
 * @param Collection|array $hashtags
 * @return self
 */
public function addHashtags($hashtags)
{
    foreach($hashtags as $hashtag){
        $this->addHashtag($hashtag);
    }
    return $this;
}

/**
 * Remove hashtag.
 *
 * @param Hashtag $hashtag
 * @return self
 */
public function removeHashtag(Hashtag $hashtag)
{
    $this->hashtags->removeElement($hashtag);
    return $this;
}

/**
 * Remove hashtags.
 *
 * @param Collection|array $hashtags
 * @return self
 */
public function removeHashtags($hashtags)
{
    foreach($hashtags as $hashtag){
        $this->removeHashtag($hashtag);
    }
    return $this;
}