2

我有一个相对简单的 Blog Post 对象,命名为Blog每个新创建(或更新)的帖子都有一些标签(以 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')) ); 
4

1 回答 1

0

这是一个多对多的关系
您确实需要一个额外的表来将 a 链接BlogPost到 a 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);
    }
}

当您 persist 时BlogPost,它的标签将被保存在一起,而无需您进行任何明确的操作。

与您希望在问题中实现的目标相比,唯一的问题是您需要实例化每个Tag以将其添加/删除到BlogPost. 您将使用对象,而不是 id!

于 2013-03-02T12:06:18.077 回答