我有一个名为Blog
的相对简单的Blog Post对象,其中每个新创建(或更新)的帖子都有一些分配给它的标签(以json数组的形式),需要循环并插入进入blog_link_tags
联接表,以便每个博文都可以分配多个标签。
目前我的代码看起来像这样,但这似乎不对。
public function insertAction(Request $request)
{
$blogPost
->setTitle( $request->request->get('post_title', '') )
->setBody( $request->request->get('post_body', '') );
$em = $this->getDoctrine()->getManager();
$em->persist($blogPost);
$tags = new BlogLinkTag();
$tags->setBlogId( */get blog post id* );
$tags->setTagId(1);
$em->persist($tags);
$em->flush();
}
有更好的方法来执行此操作吗?例如,这样的事情更有意义:
$blogPost
->setTitle( $request->request->get('post_title', '') )
->setBody( $request->request->get('post_body', '') )
->setTags( json_decode($request->request->get('post_tags')) );
答案 0 :(得分:0)
这是many-to-many relationship
您需要一个额外的表格才能将BlogPost
与Tag
相关联,但您不需要BlogLinkTag
实体,ORM会处理这个问题。
您应该做的是在$tags
中拥有BlogPost
财产:
class BlogPost
{
/**
* @Column(type="string")
*/
protected $title;
/**
* @Column(type="string")
*/
protected $body;
/**
* @ManyToMany(targetEntity="Tag") @JoinTable(
* name="blog_link_tags",
* joinColumns={@JoinColumn(name="blogPostId", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="tagId", referencedColumnName="id")}
* )
*/
protected $tags;
public function __construct() {
$this->tags = new \Doctrine\Common\Collections\ArrayCollection();
}
public function addTag(Tag $tag) {
$this->tags->add($tag);
}
public function removeTag(Tag $tag) {
$this->tags->removeElement($tag);
}
}
当您坚持BlogPost
时,其标记将一起保存,而不会有任何明确的操作。
与您希望在问题中实现的目标相比,唯一的问题是您需要实例化每个Tag
以将其添加/移除到BlogPost
。您将使用对象,而不是ID!