2013-06-12 61 views
1

實體「資產」與「logEntries」關聯。 每個資產可能有0..N個日誌條目。Symfony2,doctrine2&querybuilder:選擇關聯的最後實體(如果可用)

每個日誌條目的一部分是一個字段(或屬性)「狀態」。 每個資產的當前狀態在其最近的日誌條目中定義。 如果沒有與資產相關聯的日誌條目,則其狀態是未知的。

目前我正在計算每種狀態的資產。一個狀態的例子是:「可用」。

的問題是:

  • 或者資產被計數超過一次,如果他們在過去交替的狀態值(他們幾乎都這樣做)
  • 或者,我收到錯誤,因爲我在尋找每項資產的最近的日誌條目,但有些資產沒有日誌條目和DQL聚集函數失敗

我想下面的代碼:

$qb = $this->_em->createQueryBuilder(); 
$qb->select('COUNT(a)') 
    ->from('AppAssetBundle:Asset', 'a') 
    ->leftJoin('a.logEntries', 'l') 
    ->where('l.status = '.$status_id) 
    ->andWhere('l.id = MAX(l.id)') 
; 
return $qb->getQuery()->getSingleScalarResult(); 

的錯誤是:

SQLSTATE[HY000]: General error: 1111 Invalid use of group function

通過->having()更換->andWhere()也不能工作。

有誰知道如何獲得最近的協會實體,如果有

如果沒有相關的領域,我想我的整個查詢返回0,而不是一個錯誤:)

回答

1

如果我正確理解你的問題,不能只需在ASSOCATION實體添加createdAt場像這樣:

/** 
* @ORM\Entity() 
* @ORM\HasLifecycleCallbacks() 
*/ 
class YourClass 
{ 
    protected $asset_id; 

    protected $log_id; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $createdAt; 

    /** 
    * @ORM\PrePersist 
    */ 
    public function prePersist() 
    { 
     $this->createdAt = new \DateTime('now'); 
    } 
} 

然後,您可以簡單地按日期排序並獲取最新條目。

+1

有一個createdAt字段,但我是否抓住最高ID或最近的日期對問題沒有影響。問題是:如何獲取查詢中的最新條目?如果最新的條目不是我正在查找的狀態,或者由於沒有關聯條目而不存在,COUNT()應該返回0。 –

相關問題