我有一个实体Joke:id(int),body(text),vote(int),category(join entity)),另一个实体JokeVote:id(int),anonymousUserID(int),vote(int) 。所以匿名用户可以对每个笑话进行投票。但是当我列出这些笑话时,我想将它们联系起来,这是当前用户的笑话:
$query = $this->getEntityManager()->createQueryBuilder()
->select('j', 'c', 'jv.vote')
->from($this->getClassName(), 'j', 'j.id')
->innerJoin('j.category', 'c')
->leftJoin('MyBundle:JokeVote', 'jv', 'WITH', 'jv.joke = j.id AND jv.anonymousUserID = :anonymousUser')
->setParameter('anonymousUser', 3);
结果:
array()
0 => array(0 => array('id' => 2, 'body' => ..., 'vote' => null, category => ...), 'vote' => 1),
1 => array(0 => array('id' => 6, 'body' => ..., 'vote' => null, category => ...), 'vote' => -1),
2 => array(0 => array('id' => 4, 'body' => ..., 'vote' => null, category => ...), 'vote' => 1),
)
通过这样做,joke.vote值不会被jv.vote值替换。我想:
array(
0 => array('id' => 2, 'body' => ..., 'vote' => 1, category => ...),
1 => array('id' => 6, 'body' => ..., 'vote' => -1, category => ...),
2 => array('id' => 4, 'body' => ..., 'vote' => 1, category => ...),
)
如何使用createQueryBuilder和没有rawSQL来实现这一点?
答案 0 :(得分:1)
简短版:你不能。 Doctrine ORM querybuilder专门用于向您返回完整实体,即使列在数据库表中具有相同的名称,Doctrine也是" smart"足够不要混淆两者。
您正在构建的查询将转换为DQL(转换为SQL),并且因为您包括单个列以及实体,结果是"混合"而不是"纯粹的" (documentation)。这就是你为什么要获得数组数组的原因。
如果你想要你想要的结果,可以在映射中使用named native queries,或者对结果进行后续迭代,例如
$result = $query->getQuery()->getResult();
$ret = array();
foreach ($result as $row) {
$row[0]->setVote($row['vote']);
$ret[] = $row[0];
}
return $ret;
这是其中一种情况,即ORM(或者只是Doctrine)会比你想象的更能阻挡你。