Ben*_*min 3 php orm join dql doctrine-orm
我有以下实体映射到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;
}
Run Code Online (Sandbox Code Playgroud)
基本上,区域有父母,因此有孩子.因为孩子可能自己有孩子,所以每个区域也会保留所有孩子的列表.
每个餐厅都有一个区域.
我想要做的是执行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 = ?;
Run Code Online (Sandbox Code Playgroud)
是否可以使用Doctrine DQL执行此操作,而无需$restaurants在区域上添加属性,并且必须无用地复杂化域模型?
好吧,我终于找到了一种只使用JOIN的方法(在MySQL上明显更快):
SELECT r
FROM Restaurant r,
Zone z
JOIN z.descendants d
WHERE r.zone = d
AND z = ?1;
Run Code Online (Sandbox Code Playgroud)