教义使用查询生成器来获取具有已过滤的一对多关系的实体列表

时间:2019-07-17 15:44:43

标签: doctrine-orm doctrine doctrine-query

我有一个与用户实体具有OneToMany关系的帐户实体。此用户实体具有使用DiscriminatorMap映射的实体的不同子类型,而DiscriminatorColumn被称为“类型”。

我想使用querybuilder来获取仅具有一种特定类型的User实体的所有Account,以便我可以通过User属性之一对其进行订购。

我可以使用Native SQL和MappingBuilder来完成此工作,但我想找到一个更优雅的解决方案

        $resultSetMappingBuilder = new ResultSetMappingBuilder($this->entityManager);
        $resultSetMappingBuilder->addRootEntityFromClassMetadata('\Becky\Entity\Account', 'a');

        $sqlQuery = 'SELECT a.* FROM `account` a
            INNER JOIN `user` u
            ON `u`.`account_id` = `a`.`id`
            WHERE `u`.`type` = \'trial\'
            ORDER BY `u`.`modified_on` ASC;';
        $query = $this->entityManager->createNativeQuery($sqlQuery, $resultSetMappingBuilder);

这些是我的实体

帐户:

class Account extends Entity
{
   ....
     /**
     * @ORM\OneToMany(targetEntity="Project\Entity\User", cascade={"all"}, mappedBy="account")
     */
    protected $users;
   ...
}

用户:

/**
 * @ORM\Entity
 * @ORM\Table(name="user", options={"collate"="utf8_general_ci"})
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap({
 *     "trial"      = "Project\Entity\User\Trial",
 *     "admin"      = "Project\Entity\User\Admin",
 *     "sales"      = "Project\Entity\User\Sales"
 * })
 */
abstract class User extends Entity
{
...
    /**
     * @ORM\ManyToOne(targetEntity="Project\Entity\Account", inversedBy="users")
     * @ORM\JoinColumn(name="account_id", referencedColumnName="id")
     * @var Account
     */
    protected $account;
}

每个帐户只有1个试用用户。因此,我想要一个querybuild,它允许我使用此试用用户和订单来恢复帐户,然后通过User上的modified_on列进行订购。我确实不需要从试用中获取其他User实体,但是由于我需要根据TRIAL用户的Modifyed_on来订购帐户,因此我试图摆脱其他2个Users实体以便能够通过TRIAL进行订购修改。

示例: 可以说我有2个帐户,每个帐户有3个用户 帐户a -试用用户modified_on = 1/1/2020 -ADMIN用户modified_on = 1/1/2001 -销售用户modified_on = 1/1/2025

帐户b -试用用户modified_on = 1/1/2010 -ADMIN用户modified_on = 1/1/2015 -销售用户modified_on = 1/1/2030

我想要的是一个查询,该查询为我提供了TRIAL用户上Modifyed_on的2个按ASC顺序排列的帐户。

因此,在这种情况下,结果的第一个元素应该是帐户b,因为试用用户的修改日期为2010,早于帐户A试用用户的修改日期(2020)。

这可能是一个愚蠢的问题,但我为此深感震惊。

谢谢

0 个答案:

没有答案