Reputation: 31813
Doctrine encapsulates the native, driver specific database connection resource handle inside of its Connection classes. I'm talking about the resource returned from, for example, mysqli_connect()
. I don't see any way to access the raw connection resource - there's no getter methods that I've been able to find. This strong encapsulation should probably be a hint that I shouldn't try to access it, and use it, but of course, that's exactly what I want to do.
Would it cause any problem if I were to issue read-only select queries from the same connection? I'm not sure how doctrine's work flow operates under the hood. Database connections are stateful, and I'm a bit scared that I might jump in and issue an sql query at a moment when doctrine has some multi-step transaction partially in progress, and that would obviously cause a problem. But with php's single threaded nature I think there's a decent chance it might not be possible in practice, depending on how doctrine works.
Aside: The reason I want to do this is for performance. I have some other code that isn't written with doctrine, and it wants a raw database connection because it uses the native db extension functions. I could just open another db connection, but opening a second connection has significant performance implications in my scenario...making it very appealing to try to reuse the doctrines connection.
Upvotes: 6
Views: 3965
Reputation: 8840
Try getWrappedConnection
it returns instance of Doctrine\DBAL\Driver\PDOConnection
which is a wrapper for \PDO
:
$connection = $this->getEntityManager()
->getConnection()
->getWrappedConnection();
$stmt = $connection->prepare('SELECT * FROM `City`');
$stmt->execute();
P.S. I believe it is perfectly normal to reuse an existing connection, instead of creating a new one. I am doing this in a project that has Doctrine1 and Doctrine2.
Upvotes: 3