【问题标题】:Doctrine/DQL fill a column with anotherDoctrine/DQL 用另一列填充一列
【发布时间】:2015-08-02 20:59:44
【问题描述】:

我有一个实体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),
)

通过这样做,jv.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 来做到这一点?

【问题讨论】:

    标签: symfony doctrine dql query-builder


    【解决方案1】:

    短版:你不能。 Doctrine ORM 查询构建器专门用于向您返回完整的实体,即使数据库表中的列具有相同的名称,Doctrine 也足够“智能”,不会混淆两者。

    您正在构建的查询已转换为 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)会比您预期的更多地阻碍您的情况之一。

    【讨论】:

      猜你喜欢
      • 2013-01-02
      • 2022-11-24
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多