我有一个与用户实体具有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)。
这可能是一个愚蠢的问题,但我为此深感震惊。
谢谢