我正在使用Symfony4。我有一个包含三个表的数据库结构,其中有两个一对多的关联关系。例如:

房屋->人->狗

每个房子可以容纳许多人,每个人可以拥有许多狗。 (我的数据库实际上不是关于房子和狗的,实际的表名已更改为保护无辜的人。)使用Doctrine实体,我当然具有$house->getPersons()$person->getDogs()之类的功能。但是,实现像$house->getDogs()这样的函数的正确方法是什么?我可以提出几种解决方案,但是对我来说,这些解决方案似乎都不是“好的”解决方案:

  • 我可以简单地添加一个将House与Dog关联的一对多关系。但是,这违反了常规数据库结构的基本规则之一:无冗余数据。关系house-> person-> dog的关系已经在数据库中表示出来,因此直接从house-> dog添加另一个关系不仅是多余的,而且还可能导致狗的人住在一所房子中的情况住在另一个(这不是我想要的)。
  • 我可以做类似的事情
    foreach($house->getPersons() as $person){
        $person->getDogs();
        // Do something with each dog
        ...
    }
    

    这没有得到很好的优化,因为当我可以轻松地通过几个联接运行一个查询时,我将为每个人运行一个单独的查询(可能很多查询)。
  • 我可以使用HouseRepository或House实体中的查询构建器来运行自定义查询。据我了解,这在Symfony中是不赞成的。我们通常不希望在实体类中使用任何DQL或使用存储库,对吗?
  • 我可以在服务/ Controller 中使用HouseRepository来运行自定义查询。这将是一种简单的方法,但感觉有些不雅。不过,我感觉这可能是“正确”的方式。

  • 总结一下:我觉得我应该能够以某种方式将这个相当简单的双重联接放入我的实体中,而不必进入存储库级别来获取此数据。明确地说,我不是在问如何编写DQL连接,我不是在问放置它的正确位置,或者是否存在使用Criteria或类似方法进行此操作的Symfony巧妙方法。

    最佳答案

    如果要调用$house->getDogs(),则可以在House实体中添加一个方法。

    public function getDogs()
    {
        /** @var Doctrine\Common\Collections\ArrayCollection */
        $dogs = new ArrayCollection();
    
        if ($persons = $this->getPersons()) {
            foreach($persons as $person) {
                if ($d = $person->getDogs()) {
                    $dogs->add($d);
                }
            }
        }
    
        return $dogs;
    }
    

    关于symfony - 在Symfony中获取Entity's children's子代的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55229820/

    10-11 12:38