Doctrine / DQL用另一列填充列

时间:2015-08-02 20:59:44

标签: symfony doctrine dql query-builder

我有一个实体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来实现这一点?

1 个答案:

答案 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)会比你想象的更能阻挡你。