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 に答える