我正在使用Symfony4。我有一个包含三个表的数据库结构,其中有两个一对多的关联关系。例如:
房屋->人->狗
每个房子可以容纳许多人,每个人可以拥有许多狗。 (我的数据库实际上不是关于房子和狗的,实际的表名已更改为保护无辜的人。)使用Doctrine实体,我当然具有$house->getPersons()
和$person->getDogs()
之类的功能。但是,实现像$house->getDogs()
这样的函数的正确方法是什么?我可以提出几种解决方案,但是对我来说,这些解决方案似乎都不是“好的”解决方案:
foreach($house->getPersons() as $person){
$person->getDogs();
// Do something with each dog
...
}
这没有得到很好的优化,因为当我可以轻松地通过几个联接运行一个查询时,我将为每个人运行一个单独的查询(可能很多查询)。
总结一下:我觉得我应该能够以某种方式将这个相当简单的双重联接放入我的实体中,而不必进入存储库级别来获取此数据。明确地说,我不是在问如何编写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/