You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Doctrine createQueryBuilder缺失参数报错求助(Symfony3.3+Doctrine2.5)

问题根源与解决方案

这个报错的核心原因是Doctrine ORM 2.5.x版本的EntityRepository::createQueryBuilder()方法必须传入第一个$alias参数,而你参考的示例代码大概率是基于Doctrine 2.6+版本编写的——在2.6及以后的版本中,这个参数被改成了可选(默认值为null),所以示例里不需要传。

修正后的代码

直接给createQueryBuilder()传入你在delete语句里使用的别名'a'即可,修改后的完整方法如下:

public function deleteAdvertWithoutApplications($days) { 
  $dateparam = (new \DateTime())->modify('-' . $days . ' day'); 
  $qb = $this->createQueryBuilder('a') 
    ->delete('Advert', 'a') 
    ->where('a.application is EMPTY') 
    ->andWhere('a.updatedAt < :dateparam') 
    ->setParameter('dateparam', $dateparam); 
  $query = $qb->getQuery(); 
  return $query->execute(); 
}

额外优化建议

  1. 实体引用尽量使用完整命名空间或者类常量,避免硬编码字符串出错:
    比如把'Advert'改成Advert::class(需要先引入实体类的命名空间),或者Symfony 3里的'AppBundle:Advert'格式。
  2. 注意\datetime()的大小写,建议写成\DateTime()(符合PHP类名的规范)。

版本差异说明

你查看的EntityRepository.php第79行代码,2.5.x版本的方法定义是:

public function createQueryBuilder($alias)

而Doctrine 2.6+版本的定义则是:

public function createQueryBuilder($alias = null)

这就是为什么你参考的示例不需要传参数,但你的环境会报错的根本原因。

内容的提问来源于stack exchange,提问作者grome55

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:20:43