在Doctrine 2中创建博客文章时插入标签数组

时间:2013-01-20 19:23:07

标签: php symfony doctrine-orm

我有一个名为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')) ); 

1 个答案:

答案 0 :(得分:0)

这是many-to-many relationship 您需要一个额外的表格才能将BlogPostTag相关联,但您不需要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!