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)对您的阻碍超出您预期的情况之一。
我有一个实体笑话: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)对您的阻碍超出您预期的情况之一。