У меня есть следующие объекты, сопоставленные с Doctrine 2 :
class Zone
{
/**
* @ManyToOne(targetEntity="Zone", inversedBy="children")
* @var Zone
*/
protected $parent;
/**
* @OneToMany(targetEntity="Zone", mappedBy="parent")
* @var Zone[]
*/
protected $children;
/**
* @ManyToMany(targetEntity="Zone")
* @var Zone[]
*/
protected $descendants;
}
class Restaurant
{
/**
* @ManyToOne(targetEntity="Zone")
* @var Zone
*/
protected $zone;
}
По сути, у Зоны есть родитель, а значит и дети. Поскольку дети могут иметь детей сами, каждая Зона также содержит список всех своих потомков.
Каждому ресторану присваивается зона.
Что я хочу сделать, так это выполнить DQL-JOIN, чтобы вернуть все рестораны в определенной зоне (включая всех ее потомков).
Если бы мне пришлось сделать это простым SQL, я бы написал:
SELECT r.* from Zone z
JOIN ZoneDescendant d ON d.zoneId = z.id
JOIN Restaurant r ON r.zoneId = d.descendantId
WHERE z.id = ?;
Возможно ли это сделать с помощью Doctrine DQL без добавления свойства $restaurants
в Zone и без необходимости бесполезно усложнять модель домена?