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

Symfony使用Doctrine createNativeQuery时如何获取EntityManager实例

获取EntityManager的方法

在继承了Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository的自定义仓库类中,无需手动初始化EntityManager,直接调用基类提供的$this->getEntityManager()方法即可获取实例。

你只需要修改getById方法中调用createNativeQuery的代码即可解决变量未定义的警告,修正后的代码如下:

namespace App\Repository;

use App\Entity\News;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\ORM\Query\ResultSetMapping;

class NewsRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, News::class);
    }

    public function getById($id)
    {
        $rsm = new ResultSetMapping();
        // 调用基类方法获取EntityManager实例
        $query = $this->getEntityManager()->createNativeQuery('SELECT * FROM `news` WHERE `id`=? LIMIT 1', $rsm);
        $query->setParameter(1, $id);
        
        return $query->getResult();
    }
}

注意:原方法没有设置返回值,调用时无法获取查询结果,修正代码中补充了return语句。

额外补充说明

  • 如果需要在非Repository的自定义服务中使用EntityManager,可以通过构造函数依赖注入Doctrine\ORM\EntityManagerInterface获取实例,Symfony依赖注入组件会自动完成对象初始化,不需要手动创建。
  • 你当前的需求是按ID查询单条News记录,不需要手动编写原生SQL,直接调用Repository基类自带的$this->find($id)方法即可实现相同效果,代码更简洁,也能自动避免SQL注入风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:15:00