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 - 继承映射,查询子类的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine 2 多重映射继承

doctrine2 映射覆盖从 MappedSuperclass 继承的 inversedBy 字段。

Hibernate中的继承映射

在 Doctrine 2 继承中覆盖 inversedBy 映射

子类在继承映射中不能有标识列

原则 2:有没有办法使用 yaml 或 xml 从 trait 继承映射?