4

我在使用 Propel 1.6 提供的方法重写一个简单的查询时遇到了很多麻烦。

查询如下:

SELECT type_id, COUNT(id) as `count` FROM visit GROUP BY type_id;

使用 Propel,我编写了以下内容:

$visitCount = VisitQuery::create()
                ->withColumn('COUNT(id)', 'count')
                ->groupBy('TypeId')
                ->find();

这会生成以下查询:

SELECT visit.ID, visit.JOB_ID, visit.ENGINEER_ID,
       visit.TYPE_ID, visit.VISIT_DATE, visit.STATUS, COUNT(id) AS count 
FROM `visit` 
GROUP BY visit.TYPE_ID

哪个有效,但我只需要列type_idcount,所以我尝试添加以下内容:

$visits = VisitQuery::create()
            ->withColumn('COUNT(id)', 'count')
            ->select(array('TypeId'))
            ->groupBy('TypeId')
            ->find();

这会生成以下(工作)查询:

SELECT COUNT(id) AS count, visit.TYPE_ID AS "TypeId" 
FROM `visit` GROUP BY visit.TYPE_ID

但是,我不想为该type_id列起别名。我尝试将实际的列名传递给select数组 ( ->select(array('type_id'))),但这会导致以下查询(这显然不起作用):

SELECT COUNT(id) AS count,  AS "type_id" FROM `visit` GROUP BY visit.TYPE_ID

如何在type_id没有别名的情况下检索该列?

4

2 回答 2

3

Propel 将列名抽象化,这样您的 PHP 就不必知道它们。

来自PropelORM.org

操作对象模型名称允许您脱离实际的数据存储,并更改数据库名称,而不必更新 PHP 代码。

TypeID 将是phpName您的架构中的任何内容。尝试使用它而不是 mysql 列名。

考虑到这一点,如果你真的想使用列的实际名称,你可以使用 propel 的自省类来实现。例如:

var_dump(VisitPeer::getTableMap()->getColumnByPhpName('TypeId')->getName());
var_dump(VisitPeer::getTableMap()->getColumn('type_id')->getPhpName());

但正如文档本身所说:

请记住始终在 PHP 代码中使用 phpName

于 2013-04-25T10:07:16.800 回答
2

您显然是在尝试查询数据,而不是与您的业务模型进行交互。因此,在这种情况下,使用 ORM 可能会适得其反。对于这种逻辑,我建议您使用普通的旧 PDO(Propel 封装)。

我在 Propel 博客上推荐这个资源,回答有关如何使用 ORM 编写特殊查询的最常见问题:http: //propel.posterous.com/how-can-i-write-this-query-using-an-orm

于 2013-04-26T08:17:35.170 回答