Doctrine2 - 继承映射,查询子类
Posted
技术标签:
【中文标题】Doctrine2 - 继承映射,查询子类【英文标题】:Doctrine2 - Inheritance mapping, querying sub-classes 【发布时间】:2012-04-06 07:45:30 【问题描述】:我已经加入了表继承(我们称之为Action),我需要获取所有满足条件的Action记录,但是字段在子类中?有没有办法在不编写本机查询但使用 DQL 的情况下访问子类字段? (或 queryBuilder)?
【问题讨论】:
字段是只属于一个类,还是属于查询的几个子类? 所有子类都与不同的类有关系,但属性始终相同。 我不明白你到底想做什么。你能发布一个实体的小例子和你想要查询的内容吗? 我有 10 个实体扩展了连接继承映射实体,每个子类实体都与不同的对象有关系,该对象有不同的条件来显示。例如,我有 CommentAction Extends Actions 与 Comment 有关系,它有条件显示何时 isApproved = true 但另一个类 RateAction extends Actions 与 Ratings 有关系,它有一个显示 isActive 的属性,我想获取所有 Actions满足子类关系的条件展示。 或另一种情况,我有 10 个扩展类 Object 的实体,我想按 datePublished 对它们进行排序,但其中只有 2 个具有该属性,我可以创建 AND WHERE object INSTANCE OF That 2 classes,但是当我 ORDER BY datePublished 时,没有这样的属性,因为它在子类中。 【参考方案1】:如果您有一个子类,您可以直接查询该子类。父类的属性将被自动继承(duh)。我相信这就是您正在寻找的(基于我如何实现类表继承)。
class User
private $id;
private $username;
class Merchant extends User
private $bizname;
private $isActive;
现在根据您的说法,如果我必须获得活跃的商家,我会执行以下操作,并且对我有用:
$qb->select('m.bizname')
->from('Merchant','m')
->where('m.isActive = :flag')
->setParameter('flag',TRUE);
【讨论】:
是的,这行得通,但我想要 ->from('User','u')->andWhere('userSubClass.isActive :flag'),这就是问题所在。 上面的查询确实给出了商家活跃的所有用户..想想这个..当你想选择subclass active
..这意味着它只会返回类型为sub的用户class.. 所以选择活跃的商家会返回用户和商家的所有属性
是的,但是我有 5 个不同的子类,每个子类都有不同的条件来验证它是否处于活动状态。例如:
例如:评论、评分、收藏都扩展了Action。操作有 dateTime 列(我 orderBy)。我想获得所有操作,其中(CASE WHEN Action INSTANCE OF Comment THEN comment.isApproved WHEN Action INSTANCE OF Rating THEN rating.isActive WHEN Action INSTANCE OF Favorite THEN favorite.isRemoved END)= 1,或其他。我现在要做的是用特定的 WHERE Stmt 查询每个子类,并在应用层中对它们进行 array_merge()。
@CappY 当技术不支持您想做的事情时,您需要围绕可用技术考虑您的应用程序。我还可以确认 CASE
语句与 querybuilder 一起使用。以上是关于Doctrine2 - 继承映射,查询子类的主要内容,如果未能解决你的问题,请参考以下文章
doctrine2 映射覆盖从 MappedSuperclass 继承的 inversedBy 字段。