Doctrineで識別子を引用符で囲むようにする方法
たとえばfromというカラムがテーブル上にあったとして、
SELECT * FROM my_table WHERE from LIKE '%@gmail.com';
こんなクエリを実行しようとすると、エラーになってしまいます。fromが予約語だからですね。識別子に予約語が入る場合は、RDBMSの指定する引用符で囲んであげる必要があります。MySQLなら`(バッククオート)、PostgreSQLなら"(ダブルクオート)が識別子にあたります。
SELECT * FROM `my_table` WHERE `from` LIKE '%@gmail.com';
DoctrineでSQLを実行する際、デフォルトでは識別子で囲まれるようにはなっていません。そこで、Doctrine_Managerクラスに次のように設定してあげる必要があります。
<?php $manager = Doctrine_Manager::getInstance(); $manager->setAttribute(Doctrine_Core::ATTR_QUOTE_IDENTIFER, true); # Doctrine 1.2より前のバージョンでは Doctrine_Coreではなく Doctrine::ATTR_...
symfonyでこれらの設定をする場合はconfig/ProjectConfiguration.class.phpで行います。
<?php // autoloading... class ProjectConfiguration extends sfProjectConfiguration { // ... public function configureDoctrine(Doctrine_Manager $manager) { $manager->setAttribute(Doctrine_Core::ATTR_QUOTE_IDENTIFIER, true); } }
configureDoctrine()メソッドを定義しておくと自動的に読み込まれます。その際にManagerが引数で渡されるのでここで設定してあげます。他によく使うのは、ATTR_USE_DQL_CALLBACKSとか、ATTR_RESULT_CACHEとかですかね。
ちなみに自分自身でクオートしたい場合は、Doctrine_ConnectionオブジェクトのquoteIdentifier()で行えます。
あとはデータベース名に-(ハイフン)が入っている時とかも、これ指定しないとだめだったと思います。
http://www.doctrine-project.org/documentation/manual/1_2/en/configuration
上記のドキュメントページに色々ありますので参考にどうぞ。