0
對於這個問題,下面的兩個實體都是主角:
- ObjectElementTask
- Activitites
One ObjectElementTask可以有很多活動。
目標
我想ObjectElementTask得到所有活動的集合,以便他們得到的只是最後的活動(基於活動的「executiondate」)。
問題
我怎麼能建立從學說的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() . ')'));
但你可以猜測,這並未」工作。它只返回一行(活動中最新的一行)。我想要每個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();
你嘗試過類似'GROUP BY a.objectelementtask'嗎? –