Php 使用无别名推进选择特定列
我在使用Propel 1.6提供的方法重写一个简单的查询时遇到了不少麻烦 查询如下:Php 使用无别名推进选择特定列,php,propel,Php,Propel,我在使用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('Ty
SELECT type_id, COUNT(id) as `count` FROM visit GROUP BY type_id;
使用Propel,我编写了以下内容:
$visitCount = VisitQuery::create()
->withColumn('COUNT(id)', 'count')
->groupBy('TypeId')
->find();
$visits = VisitQuery::create()
->withColumn('COUNT(id)', 'count')
->select(array('TypeId'))
->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
SELECT COUNT(id) AS count, visit.TYPE_ID AS "TypeId"
FROM `visit` GROUP BY visit.TYPE_ID
这是可行的,但是我只需要列type\u id
和计数
,因此我尝试添加以下内容:
$visitCount = VisitQuery::create()
->withColumn('COUNT(id)', 'count')
->groupBy('TypeId')
->find();
$visits = VisitQuery::create()
->withColumn('COUNT(id)', 'count')
->select(array('TypeId'))
->groupBy('TypeId')
->find();
这将生成以下(工作)查询:
但是,我不想为type\u id
列添加别名。我尝试将实际列名传递给select
数组(->select(array('type\u id'))
),但是这会导致以下查询(显然不起作用):
如何检索
type\u id
列而不使用别名?对列名进行抽象,这样您的PHP就不必知道它们
发件人:
通过操纵对象模型名称,可以从
实际数据存储,无需更改数据库名称
更新PHP代码
TypeID将是架构中phpName
等于的任何内容。尝试使用此名称,而不是mysql列名
考虑到这一点,如果您真的想使用列的实际名称,可以使用spreep的。例如:
var_dump(VisitPeer::getTableMap()->getColumnByPhpName('TypeId')->getName());
var_dump(VisitPeer::getTableMap()->getColumn('type_id')->getPhpName());
但正如该报告本身所说:
记住在PHP代码中始终使用phpName
很明显,您试图查询数据,而不是与您的业务模型交互。因此,在这种情况下,使用ORM可能会适得其反。我建议您对这种逻辑使用普通的老PDO(它封装)
我建议您在Propel博客上提供此资源,以回答有关如何使用ORM编写特殊查询的最常见问题:,或者您可以使用
VisitPeer::TYPE_ID
。。。这是基于定义的架构名称的列名快捷方式。如果他将db列更改为my_type_id
,VisitPeer::type_id是否仍然可用(并指向该列)?否,如果他计划更改列名而不让phpName更改,则您的方法是最好的。(仅供参考,不管怎样,您的方法都是好的,这就是为什么我的输入不是一个单独的答案,只是一个旁注。:)感谢您的澄清-感谢:)不幸的是,Posterous空格不再可用。多年前它已迁移到