びっくりするほど使い辛いなDoctrine。
とりあえず
SELECT a.id AS id ,( select count(*) from b where b.a_id=a.id group by a.id ) AS count FROM a
の発行方法がわからない。
確かに簡単なSELECTやINSERTなんかはDoctrineを使えば一瞬でできるので便利といえば便利なのですが、リレーションのついてないテーブルをくっつけたり変に集約したサブクエリみたいな入り組んだものを作ったりしようとすると途端に訳が解らなくなります。
まあドキュメントをほじくり返せばこういったDQLを作成する方法も何処かに書いてあったりするようですが、よくわからん。
というわけでDoctrineで任意のSQLを発行する方法です。
getconnection.php
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//DBコネクション
$q=Doctrine::getConnectionByTableName('a');
//任意のSQL
$sql='SHOW TABLES';
//実行
$statement=$q->execute($sql);
//取得
$ret=$statement->fetchAll(PDO::FETCH_ASSOC);
|
PropelにはPropel::getConnection()という直接コネクションを取得できるメソッドがあるのですが、Doctrineには何故か存在しないようです。
Doctrine::getConnectionByTableName()は一見ATable extends Doctrine_Tableあたりを通じてコネクションを取得するメソッドのように見えますが、実際には引数を使っていないようで、適当な文字列を入れるだけでコネクションが取得できたりします。
コネクションに使用されるモジュールは環境によって変わると思いますが、PDOが入っていればPDOになると思いますので、あとは普通にPDOのメソッドを実行するだけです。
まあ掟破りな方法かもしれませんが、Doctrineが訳の解らない作りになっているのが悪い。
Symfonyの記事一覧
PR
トラックバック
トラックバックURL: