如何使用Doctrine

时间:2017-04-23 19:17:27

标签: symfony doctrine

简介

对于这个问题,以下两个实体是主要角色:

  • ObjectElementTask
  • Activitites

一个ObjectElementTask可以有很多活动。

目标

我希望获得所有活动的集合,并通过ObjectElementTask对它们进行排序,并仅获取最后一个活动(基于活动的' executiondate')。

问题

如何从Doctrine设置querybuilder来实现我的目标?顺便说一句:我使用的是Symfony 2.8。

实体

ObjectElementTask:

class ObjectElementTask
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;


    /**
     * @ORM\OneToMany(targetEntity="Activity", mappedBy="objectelementtask", cascade={"persist", "remove"}, orphanRemoval=true)
     * @ORM\OrderBy({"executionDate" = "DESC"})
     * @Expose
     */
    private $activities;

活动

class Activity {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToOne(targetEntity="ObjectElementTask", inversedBy="activities", cascade={"persist"})
     * @ORM\JoinColumn(name="objectelementtask_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $objectelementtask;

    /**
     * @ORM\Column(type="datetime", nullable=true) 
     */
    protected $executionDate;

提前致谢!

修改

根据这个问题的答案: DQL Select every rows having one column's MAX value

我想出了以下代码:

$qb = $this->getDoctrine()
    ->getRepository('AppBundle:Activity')
    ->createQueryBuilder('a')
    ->select('MAX(a.executionDate) maxDate');
$qb2 = $this->getDoctrine()
    ->getRepository('AppBundle:ObjectElementTask')
    ->createQueryBuilder('o');

$qb2->innerJoin('AppBundle:ObjectElementTask', 'oe', 'WITH', $qb2->expr()->eq('oe.activities', '(' . $qb->getDQL() . ')'));

但是你可以猜到,这不起作用。它只返回一行(Activity中的最新行)。我想要每个ObjectElementTask的最新活动。

修改2

我试过这段代码:

$activities = $this->getDoctrine()
    ->getRepository('AppBundle:Activity')
    ->createQueryBuilder('a')
    ->select('a, MAX(a.executionDate) AS HIDDEN max_date')
    ->groupBy('a.objectelementtask')
    ->getQuery()
    ->getResult();

最大日期返回上一个活动的值,但不返回完整实体(仅限最大日期...)

编辑3:

这是最终的解决方案: 这就是我最终得到我需要的东西:

$em = $this->getEntityManager();
$rsm = new ResultSetMappingBuilder($em);
$query = $em->createNativeQuery('SELECT a1.* FROM activity a1 INNER JOIN ( SELECT id, max(execution_date) MaxPostDate, objectelementtask_id FROM activity GROUP BY objectelementtask_id ) a2 ON a1.execution_date = a2.MaxPostDate AND a1.objectelementtask_id = a2.objectelementtask_id order by a1.execution_date desc', $rsm);
$rsm->addRootEntityFromClassMetadata('AppBundle:Activity', 'a1');
$activities = $query->getResult();

1 个答案:

答案 0 :(得分:0)

这就是我最终得到我需要的东西:

*CapsLock::