Doctrine/DQL 用另一列填充一列

Doctrine/DQL fill a column with another

我有一个实体笑话:id (int), body (text), vote (int), category(join entity)), 和另一个实体 JokeVote : id (int), anonymousUserID (int), vote (诠释)。因此匿名用户可以将投票归因于每个笑话。但是当我列出笑话时,我想把它们联系起来,当前用户的笑话:

$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 来做到这一点?

简短版本:你不能。 Doctrine ORM querybuilder 专门用于向您返回完整的实体,即使列在您的数据库表中具有相同的名称,Doctrine "smart" 足以不混淆两者。

您正在构建的查询已转换为 DQL(已转换为 SQL),并且由于您包括单列和实体,结果是 "mixed" 而不是"pure" (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)对您的阻碍超出您预期的情况之一。