Syntax: [[LEFT | INNER] JOIN ] [ON | WITH] [MAP] , [[LEFT | INNER] JOIN ] [ON | WITH] [MAP] , ... [[LEFT | INNER] JOIN ] [ON | WITH] [MAP] DQL supports two kinds of joins INNER JOINs and LEFT JOINs. For each joined component, you can optionally specify an alias. * The default join type is {{LEFT JOIN}}. This join can be indicated by the use of either {{LEFT JOIN}} clause or simply '{{,}}', hence the following queries are equal: SELECT u.*, p.* FROM User u LEFT JOIN u.Phonenumber SELECT u.*, p.* FROM User u, u.Phonenumber p The recommended form is the first one. * {{INNER JOIN}} produces an intersection between two specified components (that is, each and every record in the first component is joined to each and every record in the second component). So basically {{INNER JOIN}} can be used when you want to efficiently fetch for example all users which have one or more phonenumbers. SELECT u.*, p.* FROM User u INNER JOIN u.Phonenumber p By default DQL auto-adds the primary key join condition, so for DQL query: SELECT u.id, p.id FROM User u LEFT JOIN u.Phonenumber Would have a SQL equivalent: SELECT u.id AS u__id, p.id AS p__id FROM User u LEFT JOIN Phonenumber p ON u.id = p.user_id +++ ON keyword If you want to override this behaviour and add your own custom join condition you can do it with the {{ON}} keyword. Consider the following DQL query: SELECT u.id, p.id FROM User u LEFT JOIN u.Phonenumber ON u.id = 2 This query would be converted into SQL: SELECT u.id AS u__id, p.id AS p__id FROM User u LEFT JOIN Phonenumber p ON u.id = 2 +++ WITH keyword Most of the time you don't need to override the primary join condition, rather you may want to add some custom conditions. This can be achieved with the {{WITH}} keyword. DQL: SELECT u.id, p.id FROM User u LEFT JOIN u.Phonenumber WITH u.id = 2 SQL: SELECT u.id AS u__id, p.id AS p__id FROM User u LEFT JOIN Phonenumber p ON u.id = p.user_id AND u.id = 2 The Doctrine_Query API offers two convenience methods for adding JOINS. These are called innerJoin() and leftJoin(), which usage should be quite intuitive as shown below: $q = new Doctrine_Query(); $q->from('User u') ->leftJoin('u.Group g') ->innerJoin('u.Phonenumber p WITH u.id > 3') ->leftJoin('u.Email e'); $users = $q->execute();