gpt4 book ai didi

php - Symfony:持久化嵌入表单并避免重复条目

转载 作者:行者123 更新时间:2023-12-04 13:49:22 25 4
gpt4 key购买 nike

我已经在 Symfony 上玩了大约一个月了。到目前为止,我喜欢这个框架,但我遇到了一个问题,这让我对 Form 组件产生了怀疑。

概览
我有两种形式,一种用于以下实体:

  • 帖子
  • 标签

  • 它们具有多对多的双向关系。标签表单嵌入在帖子表单中,以允许动态创建新标签并与帖子相关联。

    问题
    当使用新标签条目时,这在启用级联的情况下工作得很好。但是,如果重新使用现有标签条目,则标签实体会触发唯一约束违规。嵌入式表单基本上用作仅创建新标签的实用程序,因为我想在不插入现有标签但仅与父表单关联的条件场景中使用它。

    为了尽量避免重复问题,我关闭了级联并与教义听众一起玩。但是,我找不到解决方法。有没有人有任何想法?我显然可以手动处理表单提交,但这会半途而废使用 Form 组件的目的。

    表格类型
  • 两种形式都扩展了“AbstractType”

  • Controller
  • 处理代码的特定操作看起来像这样
    $em = $this->getDoctrine()->getManager();

    $entity = $em->getRepository('B4PGround0Bundle:Blog\\Blog')->find($id);

    if (!$entity) {
    throw $this->createNotFoundException('Unable to find Blog entity.');
    }

    $deleteForm = $this->createDeleteForm($id);
    $editForm = $this->createEditForm($entity);
    $editForm->handleRequest($request);

    if ($editForm->isValid()) {
    $em->flush();

  • 实体
  • 摘自博客 类(博客与上述帖子相同)
    /**
    * @ORM\ManyToMany(targetEntity="Tag", inversedBy="blogs")
    * @ORM\JoinTable(name="tags_blogs")
    * @Assert\Valid()
    **/
    private $tags;
    .......
    public function addTag($tag)
    {
    $tags->addBlog($this);
    $this->tags[] = $tags;
    return $this
    }
  • 摘自标签 类(class)
    /**
    * @ORM\ManyToMany(targetEntity="Blog", mappedBy="tags")
    **/
    private $blogs;
    ....
    public function addBlog($blog)
    {
    $this->blogs[] = $blogs;
    return $this;
    }

    `
  • 最佳答案

    解决方案

    诀窍是订阅事件监听器,然后手动调整持久集合/UnitOfWork API。

    使用学说.event_listener

    这应该让你开始:

    Prevent duplicates in the database in a many-to-many relationship

    使用学说.orm.entity_listener

    这样做的好处是监听器只会被唤起到指定的实体。

    通过将 child 订阅到实体监听器并在“preFlush”事件期间处理重复项,我的问题得到了解决。

    这是你必须做的:

  • 使用以下内容注释实体类(在本例中为 Tag):


  • @ORM\EntityListeners({"\PathToListener\TagListener"})


  • 这是进入事件监听器的一小段代码(它需要重构,但应该可以帮助您入门)


  • /** @ORM\preFlush */ 
    public function prePersist(Tag $entities, PreFlushEventArgs $args)
    {
    //retrieve the entity manager
    $em = $args->getEntityManager();
    //retrieve the unitOfwork API
    $uow = $em->getUnitOfWork();
    //retrieve the child entities repo
    $tagRepo = $em->getRepository("\Path2ChildEntity\Tag");

    //retrieve all the entities scheduled for update
    foreach ($uow->getScheduledEntityUpdates() as $blog) {

    //we are only interested in handling blog posts
    if(!($blog instanceof \Path2ParentEntity\Blog))
    {
    continue;
    }

    //retrieve all the tags associated with the blog post entity
    $tagList = $blog->getTags();

    //lets cycle through each retrieved tag, one at a time
    foreach($tagList as $key=>$tagItem){

    //lets see if we can find a tag by this name in the repo
    $tmpTag = $tagRepo->findOneBy(array("name"=>$tagItem->getName()));

    //if the tag already exists, we don't want to insert it.
    if($tmpTag !== null)
    {
    //lets cycle through all the entities scheduledd for insertion
    foreach($uow->getScheduledEntityInsertions() as $items) {
    //if the types match and the names checkout too, remove
    the item from the insertion list

    if(($items instanceof \Path2ChildEntity\Tag) && ($items->getName()===$tmpTag->getName()))
    {
    $uow->remove($items);
    }
    }

    //adjust the blog post entity by replacing the original tag with the one from the database
    $blog->removeTag($tagList[$key]);
    $tagList[$key] = $tmpTag;
    }
    }

    $metadata = $em->getClassMetadata('\Path2ChildEntity\Tag');
    //lets ask UOW to recompute the changes that have been made to the Tag and Blog entities since the preFlush event was fired

    foreach ($tagList as $tag) {
    $uow->recomputeSingleEntityChangeSet($metadata, $tag);
    }

    $metadata = $em->getClassMetadata('\Path2ParentEntity\Blog');
    $uow->recomputeSingleEntityChangeSet($metadata, $blog);
    }

    }


    抱歉那些乱七八糟的代码家伙,但我希望它可以帮助别人。

    PS 因为我是 Doctrine 的新手,并且仍然接受围绕对象而不是表格进行建模,我有一种下沉的感觉,我的设计应该为我面临的问题归咎于我。我的意思是,得到这么简单的东西不应该这么复杂。要么 Symfony 的创建者错过了嵌入表单的技巧(不太可能),要么我仍然有很多关于对象模型的知识。

    关于php - Symfony:持久化嵌入表单并避免重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29601773/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com