3

我得到了这个 Doctrine 查询:

        select upper(substring(e.name, 1, 1)) first_letter
        from Application\Models\Exercise e
        group by first_letter
        order by first_letter asc

但它会引发异常消息:

Error: 'first_letter' does not point to a Class. 

如果我省略group byorder by,它可以工作。

在这种情况下我是否必须使用本机查询或在我的客户端代码中进行排序和分组(根据数据库中的数据量可能不是一个好主意......)或者是否有可能让这个查询工作?

谢谢!


编辑:

这是我目前的方法,不是很好,但暂时有效,因为数据库中没有太多数据:

    $tmpResult = $this->getEntityManager()->createQuery('
        select upper(substring(e.name, 1, 1)) first_letter
        from Application\Models\Exercise e
    ')->getResult();

    $groupedAndSortedResult = array();

    foreach($tmpResult as $row) {
        $groupedAndSortedResult[$row['first_letter']] = $row['first_letter'];
    }

    sort($groupedAndSortedResult);

    return array_values($groupedAndSortedResult);
4

3 回答 3

2

我知道您自己已经回答了这个问题,但只是想知道您是否尝试过使用DISTINCT

select DISTINCT upper(substring(e.name, 1, 1)) first_letter
from Application\Models\Exercise e    
order by e.name asc

在这种情况下,ordering bye.name等同于。first_letter

于 2010-10-26T17:38:31.073 回答
1

似乎没有好的方法可以通过DQL(至少我找不到),因为 Doctrine 总是试图将结果映射到实体。我最终使用PDO连接进行了本机查询。这是我在存储库中使用的代码:

    return $this->getEntityManager()->getConnection()->executeQuery('
        select upper(left(tl_exercise.name, 1)) as first_letter
        from tl_exercise
        group by first_letter
        order by first_letter asc
    ')->fetchAll(\PDO::FETCH_COLUMN);

至少我摆脱了客户端代码中的排序/分组。而且我可以使用默认情况下LEFT()不可用的功能DQL(但是您可以使用SUBSTRING())。


更新:有一种方法可以使用EntityManager::createQueryand完成此操作DQL,请参阅rojoca 的回答

于 2010-10-24T13:32:19.230 回答
0

我的猜测是它正在寻找 first_letter 作为实体。在某些 sql 查询中,您不能使用 select 语句中的计算属性作为条件,这是类似的问题。尝试以下操作:

select upper(substring(e.name, 1, 1)) first_letter
from Application\Models\Exercise e
group by upper(substring(e.name, 1, 1))
order by upper(substring(e.name, 1, 1)) asc
于 2010-10-22T17:57:08.190 回答