【问题标题】:Check if a entity already exists in the database using Symfony and Doctrine使用 Symfony 和 Doctrine 检查数据库中是否已存在实体
【发布时间】:2016-07-16 22:00:54
【问题描述】:

所以,这是我的情况。我有 3 个表,tagproducttag_product,它们是由 tagproduct 之间的“多对多”关系的注释创建的,即可以关联 tag有很多产品,一个产品可以有很多与之关联的标签。

现在,每当用户想要编辑产品时,我正在使用数据转换器将 Tag 对象转换为由逗号分隔的标签组成的字符串。

Tag 实体中,我有一个主键、一个ID 和一个唯一字段,即标记的名称。我本质上不想有两个同名的标签。

我的问题是,当提交表单以更新产品时,我不知道如何访问用户选择的“新”标签。有没有办法做到这一点?访问请求可能仅对访问标签的输入字符串有用,而不是在数据转换器中从该字符串创建的 Tag 对象。

我也可以将当前的$product 对象传递给buildForm,这会将它传递给上面提到的数据转换器,但这似乎不是一个好的解决方案,当一个对象被传递时(至少对我来说)。此外,我需要从数据转换器创建另一个实体管理器,并做数据转换器不应该做的事情。

有更好的想法吗?

编辑

我只是想也许我可以在将标签插入产品的ArrayCollection 时检查是否相同的ArrayCollection 已经包含与正在插入的标签同名的标签,但是因为我没有'不知道那个集合是否已经被当前标签填充了,那一刻......

编辑 2

我想,之前编辑中的解决方案对我不起作用,因为插入新标签时该数组集合为空......

【问题讨论】:

    标签: php symfony doctrine-orm many-to-many


    【解决方案1】:

    不确定这是否是最佳做法,但我过去所做的是使用以下ModelTransformer

    // ArrayCollection of tags to string
    function ($tags)
    {
        if ($tags === null)
            return '';
    
        return implode(',', array_map(function($tag){
            return $tag->getName();
        }, $tags->toArray()));
    }
    
    // string to ArrayCollection of tags
    function ($string)
    {
        $tags = new \Doctrine\Common\Collections\ArrayCollection();
    
        if ($string === '' || $string === null)
            return $tags;
    
        $array = explode(',', $string);
        foreach ($array as $tagName) {
            $tag = $this->em
                ->getRepository('AppBundle:Tag')
                ->findOrCreateByName($tagName);
            $tags->add($tag);
        }
    
        return $tags;
    }
    

    真正的关键是TagRepository中的findOrCreateByName()方法

    public function findOrCreateByName($name)
    {
        $name = trim($name);
    
        $tag = self::findOneBy(['name' => $name]);
    
        if ($tag === null) {
            $tag = new Tag;
            $tag->setName($name);
        }
    
        return $tag;
    }
    

    【讨论】:

    • 所以这类似于我检查变压器的想法......最后,如果我在控制器中找不到解决方案,我想,我就是这个地方应该这样做,我会选择这个选项......如果我可以在提交表单的所有转换之后以某种方式访问​​数据,我可以在控制器中完成......
    • 我认为控制器不适合做这个。它应该与模型无关,这意味着不知道/不在乎它们是否已经存在,这显然是模型/存储库的一部分。
    • 是的,但是使用或不使用存储库访问和修改数据库数据的工作通常在控制器中完成(显式或不显式,即通过调用服务)...
    • 是的。很高兴听到您是否找到另一个/更清洁的解决方案
    猜你喜欢
    • 2014-09-04
    • 2013-02-27
    • 1970-01-01
    • 2022-10-02
    • 2019-01-17
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多