2017-04-23 62 views
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(); 
+0

你嘗試過類似'GROUP BY a.objectelementtask'嗎? –

回答

0

這是怎麼了,我終於得到了我需要的東西:

$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();