我正在尝试在数据库中插入数组集合。对象之间的关系是 ManyToMany 。所以我想发布一条消息并添加一些主题标签(不只是一个,例如存储在Doctrine 2数组集合中的一些)。没有错误,但对象未链接:(表messages
和hastags
都包含数据,但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();
该消息将出现在数据库中,但没有指向主题标签的链接。
答案 0 :(得分:1)
您的映射严重错误。
inversedBy
和mappedBy
字段都指向" 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;
}