使用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_id
和count
,所以我尝试添加以下内容:
$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
列?
答案 0 :(得分:3)
Propel抽象列名称,以便您的PHP不一定需要了解它们。
操纵对象模型名称允许您从中分离 实际数据存储,并且无需更改数据库名称 更新PHP代码。
TypeID将是架构中的phpName
等于。尝试使用它而不是mysql列名。
考虑到这一点,如果你真的想使用列的实际名称,你可以使用propel introspection classes来实现。例如:
var_dump(VisitPeer::getTableMap()->getColumnByPhpName('TypeId')->getName());
var_dump(VisitPeer::getTableMap()->getColumn('type_id')->getPhpName());
但正如documentation本身所说:
请记住始终在PHP代码中使用phpName
答案 1 :(得分:2)
您显然是在尝试查询数据,而不是与您的商业模式进行互动。因此,在这种情况下,使用ORM可能会适得其反。我建议您使用普通的旧PDO(Propel封装)来实现这种逻辑。
我在Propel博客上推荐这个资源,回答有关如何使用ORM编写特殊查询的最常见问题:http://propel.posterous.com/how-can-i-write-this-query-using-an-orm