1

我正在尝试将默认 DBAL 连接注入与实体关联的自定义存储库,以便我可以执行一些原始 sql 查询。

在 services.mxl

<service id="acme.repository.document" class="Acme\Bundle\Repository\DocumentRepository">
      <argument type="service" id="doctrine.orm.entity_manager" />
      <argument>Acme\Bundle\Entity\Document</argument>
      <argument type="service" id="database_connection" />
</service>

在我的存储库类 DocumentRepository.php

class DocumentRepository extends EntityRepository {

    protected $conn;

    public function __construct($em, $class, Connection $conn)
    {
        $this->conn = $conn;
         parent::__construct($em,$class);
    }

但我得到这个错误:

可捕获的致命错误:传递给 Acme\Bundle\Repository\DocumentRepository::__construct() 的参数 3 必须是 Doctrine\DBAL\Connection 的实例,没有给出,在 /project/vendor/doctrine/orm/lib/Doctrine/ORM 中调用/EntityManager.php 在第 689 行并在 /project/src/Acme/Bundle/Repository/DocumentRepository.php 第 18 行中定义

你能帮帮我吗?

4

4 回答 4

4

很多小时后,继续寻找最佳答案。我发现Elnur Abdurrakhimov的答案是最好的(在我看来,以及我的用例)。

来源https ://stackoverflow.com/a/12908748/1617890

use Doctrine\DBAL\Connection;

public function __construct(Connection $connection)
{
    $this->connection = $connection;
}
my_listener:
    arguments: [ @database_connection ]
于 2013-04-17T13:00:23.517 回答
2

您可以从 EntityRepository 类的 $_em 属性访问连接,因此您可以这样做;

$connection = $this->_em->getConnection();
于 2016-08-19T14:54:12.650 回答
0

EntityRepository在 Doctrine ORM是内部构建的。您仍然可以定义自己的服务,也可以是存储库,然后使用该服务。这是 ORM 的一个限制,因为 Doctrine 在内部不使用服务位置或依赖注入容器。

于 2013-02-08T20:17:28.260 回答
-1

问题是你没有传递正确的连接实例,试试这个:

use Doctrine\DBAL\DriverManager;

class DocumentRepository extends EntityRepository 
{

    protected $conn;

    public function __construct($em, $class)
    {
        $this->conn = $this->myHandleConnection();
         parent::__construct($em,$class);
    }

    public function myHandleConnection()
    {
        $config = new \Doctrine\DBAL\Configuration();
        $connectionParams = array(
                'dbname' => 'MY_DB',
                'user' => 'root',
                'password' => 'root',
                'host' => 'localhost',
                'driver' => 'pdo_mysql',
                'charset' => 'utf8',
                );
        $conn = DriverManager::getConnection($connectionParams, $config);
        return $conn;
    }
}
于 2013-03-14T15:04:53.303 回答