Symfony2,doctrine2& querybuilder:选择关联的最后一个实体(如果可用)

时间:2013-06-12 14:13:40

标签: symfony doctrine-orm associations aggregation dql

实体“资产”与“logEntries”相关联。 每个资产可能有0..N个日志条目。

每个日志条目的一部分是字段(或属性)“status”。 每个资产的当前状态在其最新的日志条目中定义。 如果没有与资产关联的日志条目,则其状态未知。

目前,我正计算每种状态的资产。状态的一个示例是:“可用”。

问题在于:

  • 如果资产过去具有交替的状态值(他们几乎所有人都这样做),则资产会被计算多次。
  • 或者,我收到错误,因为我正在搜索每个资产的最新日志条目,但有些资产没有日志条目,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]:常规错误:1111无效使用组功能

->andWhere()替换->having()也不起作用。

有谁知道如何获取关联的最新实体,如果有的话

如果没有关联的字段,我希望我的整个查询返回0而不是错误:)

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,你就不能在关联实体中添加一个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');
    }
}

然后你可以按日期排序并抓住最新的条目。