原则:选择查询以刷新水合实体联接?

时间:2018-11-20 15:26:21

标签: symfony doctrine-orm

查询将主要实体与其连接的实体一起装入并水合,并对其进行过滤。
具有不同过滤条件的相同查询不会更新联接的实体。

一些数据:

Promise.all

执行2个查询,以获取一些已加入其容器的层,首先是类别A,然后是类别B:

Tiers:
| id | name  |
| 1  | alpha |
| 2  | beta  |

Container:
| id  | tiers_id | category |
| 10  | 1        | A        |
| 20  | 1        | A        |
| 30  | 1        | B        |
| 40  | 1        | B        |

第二次查询后,第1层保留其在第一次查询期间加载的容器。那不是预期的。
那么有没有办法在第二次查询后获取容器30和40?
也许是在第一次查询后“重置/分离”层实体的容器?
还是其他...


查询中的多重选择用于将已连接所需容器的层水化。
“ getContainers”方法给出了每个层的预期容器。
无论搜索多少层,BDD的成本只有1个SQL查询。


我想不能分离/重新加载层,因为它们是在查询之前,之间和之后更新的,因此在刷新时会抛出这种异常:

$dql = "select t, c
    from Tiers t
    join t.containers c
    where t.id in (?1) and c.category = (?2)";

$result = $em->createQuery($dql)
    ->setParameter(1, array(1))
    ->setParameter(2, 'A')
    ->getResult();
$tiers = $result[0];
$containers = $tiers->getContainers(); // tiers 1 with containers 10 and 20, that's fine !

$result = $em->createQuery($dql)
    ->setParameter(1, array(1))
    ->setParameter(2, 'B')
    ->getResult();
$tiers = $result[0];
$containers = $tiers->getContainers(); // BAD HERE: still get containers 10 and 20, looking for containers 30 and 40.

1 个答案:

答案 0 :(得分:0)

在第二次查询之前重置层的容器:

foreach($result as $tiers)
    $tiers->nullContainers();

将方法添加到Entity \ Tiers:

public function nullContainers()
{
     this->containers = null;
}

然后第二个查询“刷新”层的容器。