DoctrineでSQLを直接実行する
ORMの構文を必ず使う必要なんてないのですよ。
<?php // なんでもいいのでConnectionとってくる $employeeTable = Doctrine_Core::getTable('Employee'); $con = $employeeTable->getConnection(); $sql = "SELECT * FROM employee where YEAR(employed_at) = :year"; $employees = $con->fetchAll($sql, array(':year' => 2009)); $sql = "SELECT * FROM employee ORDER BY employed_at DESC LIMIT 1"; $employee = $con->fetchRow($sql); $sql = "SELECT id FROM employee"; $employee_ids = $con->fetchColumn($sql); $sql = "SELECT employed_at FROM employee WHERE employee_id = ?"; $employed_at = $con->fetchOne($sql, array(5)); $con->insert($employeeTable, array('name' => 'Katsuhiro Ogawa', 'employed_at' => '2006-12-18')); $id = $con->lastInsertId($employeeTable->getTableName()); $con->update($employeeTable, array('title' => 'architect'), $id); $stmt = $con->execute('TRUNCATE employee'); // More... // @see Dotrine_Connection.php
Doctrineで生のSQLを吐きたいときは、Doctrine_Connectionからやることになります。$con->getDbh()でPDOオブジェクトとってくることもできますが、Doctrine_Connectionのメソッドだけで十分かと思います。
Doctrine_RawSqlクラスもありますが、過度な期待はしないほうがいいですよ。
ちなみにDoctrine_Queryの実行結果を配列で取得したい場合などは
<?php class EmployeeTable extends Doctrine_Table { public function getArchitectsAsArray() { return $this->createQuery() ->where('title = ?', 'architect') ->fetchArray(); // alias for ->execute(array(), Doctrine_Core::HYDRATE_ARRAY); } public function getEmployeeAsArrayById($id) { return $this->createQuery() ->where('employee_id = ?', $id) ->fetchOne(array(), Doctrine_Core::HYDRATE_ARRAY); } }
他には取得結果のオブジェクトに->toArray()をかますと配列に。