Voy a poner un pequeño resumen de como manejarse un poco con las sentencias DQL de Doctrine.
Voy a poner un ejemplo de lo que sería una sentencia DQL my simple por defecto.
$doctrine_collection_object = Doctrine::getTable('usuarios')->findBy('id',453);
Lo primero a tener en cuenta es que DQL no es SQL, si entendemos ésto muy bien tendremos menos problemas y también tener en cuenta que tenemos múltiples maneras de realizar los queries a nuestra base de datos (métodos estáticos, instanciando las clases de las tablas e incluso con SQL nativo).
Disponemos de muchos métodos para realizar consultas, AND, OR, WHERE , ANDWHERE, ORWHERE, etc..
Un ejemplo de realizar un join en Doctrine:
Imaginaros que tenemos las tablas de poblaciones, zonas y tipo_poblacion. Y queremos obtener todas las poblaciones del tipo 2 en el que el nombre esté contenido en el nombre de la población y también en el de la zona.
En la clase poblacionTable creamos el siquiente método:
public static function retrieveByNombre($nombre, $tipo) {
$query = self::getInstance()->
createQuery("p")->
leftJoin("p.tipo t")->
leftJoin("p.zona z")->
Where ("t.id_tipo = ".$tipo)->
andWhere("p.poblacion LIKE '%".$nombre."%' OR z.nombre LIKE '%".$nombre."%'");
return $query->execute();
}
Como vereis es una mezcla entre SQL y las propias clases del squema YML. Las relaciones se basan en las clases y no en las tablas, incluso si son relaciones n to n, doctrine no las diferencia. En nuestro caso tenemos una relacion n-to-n para los tipos y otra 1-to-n para las zonas.
Si queremos depurar la sentencia SQL podemos utilizar el método $query->getSqlQuery(); que nos devuelve la sentencia SQL completa.
Aquí os dejo el link de la documentación de Doctrine Documentación