我使用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是否可以实现这一点,而不必在Zone上添加$restaurants属性,并且不必使域模型变得复杂化?