PropelのdoCountでちょっとハマった

松本です。

Symfonyで開発する場合にORMは大体Propelを指定しています。
COUNT文を発行する時に使うのは通常だと

HogePeer::doCount($criteria);

みたいに各PeerのdoCountなんですが、このメソッドには$connectionを渡すことができないんですね。
トランザクション張って複数回sqlを叩いて最後にcommitしたいような時には

BasePeer::doCount($criteria, $connection);
BasePeerのdoCountを叩いてfetchしているんですが、JOINして重複レコードは排除して数えたいようなケース

つまりDISTINCTを追加した時に少しハマりました。
DISTINCTをセットするには下記のように記述しますが

$c->setDistinct();

この時にdoSelectは問題なくDISTINCTで重複を弾いて結果を取得できますがdoCountすると怒られます。

Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘FROM

この時生成されたSQLを確認すると、

SELECT DISTINCT FROM

取得対象のカラムが全部消えてます。なので

$c->addSelectColumn(self::ID);

取得するカラムを追加してやると無事COUNTできました。重複も弾いています。
ちなみにGROUPBYする場合も同じで、取得カラムを指定してあげないとエラーになるようです。

技術

Categoryカテゴリー一覧

メニューを閉じる

tagタグ一覧

メニューを閉じる