2015-10-13 70 views
0

我在我的網站上使用了zend 2一個學說2。我想要做一個本地的SQL查詢,因此需要一個MySQL連接。我想從Zend 2內部訪問doctrine 2 DBAL以獲取原生sql查詢

我明白教義2經由DBAL

我指的是馬克羅比森給出了這樣的here

學說2 ORM使用學說2 DBAL,是繞PDO薄但有用 包裝數據庫層。你可以檢索從 服務容器(這就是所謂的「database_connection」,並給它 任何你想要的SQL,CASE和所有例如,在你的控制器

$dbal = $this->get('database_connection'); 
$stmt = $dbal->prepare('SELECT foo FROM bar WHERE baz = :baz'); 
$stmt->bindValue('baz', 'qux'); 

我能夠通過訪問我的實體管理器;

public function getEntityManager() 
     { 
      if (null === $this->em) { 
       $this->em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default'); 
      } 
      return $this->em; 
     } 

回答

1

不能確定什麼的問題卻是實實在在。您可以使用您用於獲取實體管理器的相同方法。只需要改變服務ID:

public function getConnection() { 
    if (null === $this->conn) { 
    $this->conn = $this->getServiceLocator()->get('database_connection'); 
    } 
    return $this->conn; 
} 

順便說一句,使用本地變量緩存的結果可能是代碼的浪費。只需在需要時將其從服務定位器中拉出即可。

或者,如果你已經有了實體管理器,然後進行簡單:

$connection = $entityManager->getConnection(); 

可能要閱讀了關於什麼DBAL連接對象實際上是以及如何使用它一下。

http://doctrine-dbal.readthedocs.org/en/latest/reference/data-retrieval-and-manipulation.html

1

您可以用您EntityManagerResultMapping實例這樣運行了一個本地查詢:

use Doctrine\ORM\Query\ResultSetMapping; 

$rsm = new ResultSetMapping(); 

$entityManager = $htis->getEntityManager(); 
$query = $entityManager->createNativeQuery(
    'SELECT id, name, discr FROM users WHERE name = ?', $rsm 
); 
$query->setParameter(1, 'romanb'); 

$users = $query->getResult(); 

這都straight from the documentation of Doctrine 2

但你也可以使用更多的本地解決方案,如DQLuse the EntityManager directly to find objects