2

私は、新しく作成された (または更新された) 投稿ごとにいくつかのタグ (json 配列の形で) が割り当てられているという名前の比較的単純なブログ投稿オブジェクトを持っています。これをループして結合テーブルにBlog挿入する必要があるため、各ブログ投稿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を a
にリンクするには追加のテーブルが必要ですが、エンティティは必要ありません。ORM がこれを処理します。BlogPostTagBlogLinkTag

あなたがすべきことは、$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 ではなく、オブジェクトを操作します。

于 2013-03-02T12:06:18.077 に答える