Php Symfony 2:如何在服务中执行sql查询
上周我开始使用Symfony 2,我对如何使用模型以及如何创建自己的特定函数感到有点困惑 我在services.yml文件中创建了一个服务测试:Php Symfony 2:如何在服务中执行sql查询,php,symfony,Php,Symfony,上周我开始使用Symfony 2,我对如何使用模型以及如何创建自己的特定函数感到有点困惑 我在services.yml文件中创建了一个服务测试: services: testing: class: AppBundle\Service\MyService arguments: [ @doctrine.orm.entity_manager ] 这是MyService类 class myService { /** * @InjectParams({ * "em" = @Inject("
services:
testing:
class: AppBundle\Service\MyService
arguments: [ @doctrine.orm.entity_manager ]
这是MyService类
class myService
{
/**
* @InjectParams({
* "em" = @Inject("doctrine.orm.entity_manager")
* })
*/
public function __construct(EntityManager $em)
{
$this->em = $em;
}
function getQuery($id){
$sql = "SELECT firstname FROM players WHERE id = $id";
$em = $this->getDoctrine()->getManager();
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
$players = $stmt->fetchAll();
}
我希望在服务中执行查询,并在控制器中加载函数getQuery(),如下所示:
$locationService = $this->container->get('testing');
$ownFunction = $locationService->getQuery($id);
当我执行上面的脚本时,我得到了一个错误。我认为它一定是错误的
function getQuery($id){
$sql = "SELECT firstname FROM players WHERE id = $id";
$stmt = $this->em->getConnection()->prepare($sql);
$stmt->execute();
$players = $stmt->fetchAll();
“$em=$this->getDoctrine()->getManager();”不再需要了,因为您已经将条令实体管理器作为$this->em注入到构造中。您的
getQuery
方法是错误的。既然您已经将EntityManager
注入到构造函数中,您应该使用它(您的服务``中没有可用的getdoctor
方法)
编辑:您还错过了
使用条令\ORM\EntityManager
在您的类的顶部您会遇到什么错误?您已经在服务定义中注入了EntityManager
。不需要使用Inject
注释。您可以直接访问$this->em
,显然您的注释是无用的。放下它,再试一次我,我试图根据你的建议重写脚本,但我总是得到相同的可捕获错误致命错误:传递给AppBundle\Service\Testing的参数1::\uu construct()必须是AppBundle\Service\EntityManager的实例,给定的条令\ORM\EntityManager的实例,在第2565行的/WWW/lab.blueye.ch/WWW/app/cache/dev/appDevDebugProjectContainer.php中调用并定义
public function getQuery($id){
$sql = "SELECT firstname FROM players WHERE id = :id";
$stmt = $this->em->getConnection()->prepare($sql);
$stmt->bindValue(':id', $id); //you should do this to be sql-injection safe
$stmt->execute();
return $stmt->fetchAll(); //you didn't return anything in your function
}