Php 使用无别名推进选择特定列

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

我在使用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();
$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空格不再可用。多年前它已迁移到