繁体   English   中英

Symfony2 ManyToMany嵌入式表格

[英]Symfony2 ManyToMany embedded forms

我的应用程序中有一个Post and Tag实体,并且它们之间需要多对多的关联。 我认为我管理得当,但不确定。 这是我的实体:

帖子:

/**
* @ORM\Table(name="posts")
*/
class Post
{
    ( ... )

    /**
    * @ORM\OneToMany(targetEntity="PostTag", mappedBy="post_id")
    */
    private $tags;

    public function __construct()
    {
    $this->tags = new ArrayCollection();
    }

    ( ... )
}

标签:

class Tag
{
    /**
     * @ORM\Column(name="tagname", unique=true, type="string", length=255)
     */
    private $tagname;

    /**
     * @ORM\OneToMany(targetEntity="PostTag", mappedBy="tag_id")
     */
    private $posts;

    public function __construct()
    {
        $this->posts = new ArrayCollection();
    }

    ( ... )
}

我还创建了一个PostTag实体来存储这些关系:

/**
* @ORM\Table(name="post_tags")
* @ORM\Entity
*/
class PostTag
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Post", inversedBy="tags")
     * @ORM\JoinColumn(name="post_id", referencedColumnName="id")
     */
    private $post_id;

    /**
     * @ORM\ManyToOne(targetEntity="Tag", inversedBy="posts")
     * @ORM\JoinColumn(name="tag_id", referencedColumnName="id")
     */
    private $tag_id;

    ( ... )
}

当然,所有3个都带有适当的吸气剂/吸气剂。 这样关系好吗?

我相信我是对的,但现在我正努力为Post实体制作嵌入式表格。 我需要的是在PostType中创建一个标签字段,在其中可以键入保存在标签表中的标签以及新创建的标签的ID,并在post_tags表中进行张贴。 我还希望已经保存的标签在另一个字段中可供选择,这就是为什么我要用这种方式构建实体的原因。

我尝试编写此代码,但确实与错误代码混淆,因此我什至不尝试复制自己的代码。 有人可以简短地启发我,我应该如何做到这一点?

谢谢

您不需要PostTag之间的中介实体。 我本人努力使它恢复正常工作几个月,但是在仔细阅读《 多对多单向》之后 ,我设法做到了。

问题的关键是,你不创建Many-To-OneOne-To-Many关系,但单一的Many-To-Many

关于嵌入式表单,一旦在PostTag之间建立了Many-To-Many关系,就需要使用collection字段表单类型。 基本上,您会说:“好吧,我有一个表单,其中包含Post字段,其中可以包含许多 Tags

当然,我建议您先尝试手动管理数据(持久性,更新,删除),然后再使其与表单一起使用。 如果您的模型有错误,则定位问题的源将更加困难,因为表单本身可能很棘手。

Symfony官方文档对此有很棒的文章 ,但是,我必须说,对于Symfony初学者来说,这有点不知所措,就像我在阅读它时一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM