繁体   English   中英

使用Propel选择特定列而不使用别名

[英]Select specific column(s) using Propel without aliasing

使用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列?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM