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
相关产品推荐
相关产品推荐

