我想获取一些实体,其中一部分关联已加载。
这是一种自我参照的等级关系,有一个像这样的表:
CREATE TABLE entities (
id serial PRIMARY KEY,
parent_id integer REFERENCES entities,
attribute_id integer REFERENCES attributes,
[...]
);
现在我想用一些子进程预加载一个实体,匹配一个WHERE子句,比如entities.attribute_id =?。
我在普通的SQL中有这样的:
SELECT * FROM entities p_ent INNER JOIN entities c_ent ON p_ent.id = c_ent.parent_id WHERE c_ent.attribute_id = ?
但我不知道如何在Doctrine中做到这一点。
当然我试过了:
$qb = $em->createQueryBuilder();
$qb->select('p_ent', 'c_ent')
->from('Entities', 'p_ent')
->innerJoin('p_ent.children', 'c_ent')
->where('c_ent.attribute = ?1')
->setParameter(1, $attr);
但是这不起作用 - 关系总是被所有子实体完全加载。
答案 0 :(得分:0)
尝试:
$qb = $this->_em->createQueryBuilder()
->select('PARTIAL p_ent.{id, your_fields ...}')
->from($this->_entityName, 'p_ent')
->innerJoin('p_ent.children', 'c_ent')
->addSelect('PARTIAL c_ent.{id, your_fields ...}')
->where('c_ent.attribute = ?1')
->setParameter(1, $attr);