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する場合も同じで、取得カラムを指定してあげないとエラーになるようです。
技術