I am using doctrine 2.7 with asUnbuffered
, due to very large result set. I want to query an entity with a relation to another entity (many to one). My code looks something like this:
$em = new EntityManager();
$em->asUnbuffered('connectionId');
$queryBuilder = $em->createQueryBuilder();
$queryBuilder
->select(Employee::class)
->from(…)
->where(…)
->setParameter(…);
$query = $queryBuilder->getQuery();
$query->setFetchMode(Employee::class, 'department', ClassMetadataInfo::FETCH_EAGER);
foreach ($query->iterate() as $row) {
yield $row[0];
$em->clear();
}
Unfortunately, the Department entity is not being loaded on each iteration. I expect it to be loaded since I use FETCH_EAGER
. So for example when I call an inner method of Department
, e.g. Department->getId()
, I get an error like this: Cannot execute queries while other unbuffered queries are active.
.
I found a bypass, which is to use the deprecated method $em->detach()
instead of $em->clear()
. I assume this only detaches the Employee
entity but not the Department
. But if the Department
should be fetched on each iteration, why does $em->clear()
not working?
I would like to understand the mechanism, and not just to have something to copy-paste into my code.
from Doctrine fetch eagrly does not keep track of referenced entity
No comments:
Post a Comment