原始SQL查询Symfony

时间:2014-03-11 14:49:22

标签: php symfony doctrine-orm

目前我已经创建了一个名为getData.php的模型,该模型使用原始查询从数据库中提取信息并将其传递回主控制器。

访问getdata.php

namespace Destination\AppBundle\Models;
use Doctrine\ORM\EntityRepository;

class getData extends EntityRepository
{

    public function getInfo(){

            $stmt = $this->getEntityManager()
            ->getConnection()
            ->prepare('select * cms_clients');
            $stmt->execute();
            $result = $stmt->fetchAll();

            return $result;
    }

}

Maincontroller.php

namespace Destination\AppBundle\Controller;
use Doctrine\ORM\EntityRepository; 
use Destination\InterfaceBundle\Controller\AbstractController;
use Destination\AppBundle\Models\getData;
class DefaultController extends  AbstractController


    public function indexAction(Request $request)
    {
    $fetchData = new getData;   

        $fetchData->getInfo();


        return $this->render('DestinationAppBundle:Default:app.html.twig');   

    }

]

但我一直得到同样的错误说

  

ContextErrorException:警告:缺少参数1   Doctrine \ ORM \ EntityRepository :: __ construct(),调用   C:\ Users \用户brent.french \文档\ WWW \用户\程序\ SRC \目标\的appbundle \控制器\ DefaultController.php   在第33行并在中定义   C:\ Users \用户brent.french \文档\ WWW \用户\程序\供应商\原则\ ORM \ LIB \原则\ ORM \ EntityRepository.php   第67行

任何想法?

2 个答案:

答案 0 :(得分:0)

基本问题是你的getData类扩展了EntityRepository,它(如错误消息所示)期望它的构造函数中有一些参数。

如果您决定使用原始查询,请将连接注入getData类

class GetData
{
    public function __construct($conn)
    {
        $this->conn = $conn;

// In your controller
$getData = new GetData($this->getEntityManager()->getConnection());

您可以更进一步,将GetData定义为服务:

cerad_app_cerad.persons.export_xml:
    class: Cerad\Bundle\AppCeradBundle\Services\Persons\Persons01ExportXML
    arguments:
        - '@doctrine.dbal.default_connection'

// In your controller
$getData = $this->get('cerad_app_cerad.persons.export_xml');

顺便说一下,DBAL连接对象有一些很好的方便方法:

    $rows = $this->conn->fetchAll('SELECT * FROM cms');

答案 1 :(得分:0)

问题是你正在使用EntityRepository,但你不应该直接访问你在EntityRepository中定义的方法,就像你在这里一样:

$fetchData = new getData;   
$fetchData->getInfo();

您必须通过任何“getData”的“父”来访问该方法。

例如,如果您有一个名为Data的实体:

/**
* @ORM\Entity(repositoryClass="namespace\yourbundle\Entity\getData")
*/
class Data {
/** your setters and getters **/
}

然后您可以通过以下方式访问控制器中的getData方法:

$em = $this->getDoctrine()->getEntityManager();
$getData =  $em->getRepository('YourBundle:Data')->getData();

确保在控制器顶部包含实体存储库的路径:

use Namespace\YourBundle\Entity\GetData;

否则,您可能会收到错误(取决于您的symfony版本)。

在您的示例中,您的名称空间似乎被称为Destination,而您的包名称为AppBundle

然后@ORM\Entity注释应如下所示:

/**
 * @ORM\Entity(repositoryClass="Destination\AppBundle\Model\getData")
 */

阅读symfony2文档的这一部分,他们详细阐述了这个主题:

http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes