Skip to content

Commit

Permalink
Fixed doctrine/dbal does not works. (#3141)
Browse files Browse the repository at this point in the history
* Fixed doctrine/dbal does not works.

* Fixed by laravel/framework#35236
  • Loading branch information
limingxinleo committed Jan 15, 2021
1 parent 53c8462 commit fecdb50
Show file tree
Hide file tree
Showing 7 changed files with 232 additions and 4 deletions.
1 change: 1 addition & 0 deletions CHANGELOG-2.1.md
Expand Up @@ -7,6 +7,7 @@
- [#3118](https://github.com/hyperf/hyperf/pull/3118) Fixed bug that the config key of migrations is not correct.
- [#3126](https://github.com/hyperf/hyperf/pull/3126) Fixed bug that swoole v4.6 `SWOOLE_HOOK_SOCKETS` conflicts with jaeger tracing.
- [#3137](https://github.com/hyperf/hyperf/pull/3137) Fixed type hint error, when don't set `true` for `PDO::ATTR_PERSISTENT`.
- [#3141](https://github.com/hyperf/hyperf/pull/3141) Fixed `doctrine/dbal` does not works when using migration.

## Added

Expand Down
4 changes: 4 additions & 0 deletions docs/zh-cn/upgrade/2.1.md
Expand Up @@ -111,6 +111,10 @@ return [

因为组件 `hyperf/paginator` 已从 `hyperf/database` 依赖中移除。所以在 database 中使用到分页器的同学,还需要额外引入 `hyperf/paginator` 组件。

## 修改DBAL版本

倘若使用了 `doctrine/dbal` 组件,则需要升级到 `^3.0` 版本。

## 注意事项

- 尽量不要将老项目的引擎修改为 Swow,如果想要使用 Swow,请尽量在新项目中尝试。因为 Swow 并不是 Swoole 的替代品,所以并不是所有 Swoole 的场景,都能在 Swow 中找到对应的替代方案。
9 changes: 7 additions & 2 deletions src/database/src/Connection.php
Expand Up @@ -570,7 +570,12 @@ public function getDoctrineColumn($table, $column)
*/
public function getDoctrineSchemaManager()
{
return $this->getDoctrineDriver()->getSchemaManager($this->getDoctrineConnection());
$connection = $this->getDoctrineConnection();

return $this->getDoctrineDriver()->getSchemaManager(
$connection,
$connection->getDatabasePlatform()
);
}

/**
Expand All @@ -586,7 +591,7 @@ public function getDoctrineConnection()
$this->doctrineConnection = new DoctrineConnection([
'pdo' => $this->getPdo(),
'dbname' => $this->getConfig('database'),
'driver' => $driver->getName(),
'driver' => null,
], $driver);
}

Expand Down
30 changes: 30 additions & 0 deletions src/database/src/DBAL/Concerns/ConnectsToDatabase.php
@@ -0,0 +1,30 @@
<?php

declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace Hyperf\Database\DBAL\Concerns;

use Hyperf\Database\DBAL\Connection;
use PDO;

trait ConnectsToDatabase
{
/**
* Create a new database connection.
*/
public function connect(array $params)
{
if (! isset($params['pdo']) || ! $params['pdo'] instanceof PDO) {
throw new \InvalidArgumentException('The "pdo" property must be required.');
}

return new Connection($params['pdo']);
}
}
168 changes: 168 additions & 0 deletions src/database/src/DBAL/Connection.php
@@ -0,0 +1,168 @@
<?php

declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace Hyperf\Database\DBAL;

use Doctrine\DBAL\Driver\PDO\Exception;
use Doctrine\DBAL\Driver\PDO\Result;
use Doctrine\DBAL\Driver\PDO\Statement;
use Doctrine\DBAL\Driver\Result as ResultInterface;
use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
use Doctrine\DBAL\Driver\Statement as StatementInterface;
use Doctrine\DBAL\ParameterType;
use PDO;
use PDOException;
use PDOStatement;

class Connection implements ServerInfoAwareConnection
{
/**
* The underlying PDO connection.
*
* @var PDO
*/
protected $connection;

/**
* Create a new PDO connection instance.
*/
public function __construct(PDO $connection)
{
$this->connection = $connection;
}

/**
* Execute an SQL statement.
*/
public function exec(string $sql): int
{
try {
$result = $this->connection->exec($sql);

\assert($result !== false);

return $result;
} catch (PDOException $exception) {
throw Exception::new($exception);
}
}

/**
* Prepare a new SQL statement.
*/
public function prepare(string $sql): StatementInterface
{
try {
return $this->createStatement(
$this->connection->prepare($sql)
);
} catch (PDOException $exception) {
throw Exception::new($exception);
}
}

/**
* Execute a new query against the connection.
*/
public function query(string $sql): ResultInterface
{
try {
$stmt = $this->connection->query($sql);

\assert($stmt instanceof PDOStatement);

return new Result($stmt);
} catch (PDOException $exception) {
throw Exception::new($exception);
}
}

/**
* Get the last insert ID.
*
* @param null|string $name
* @return string
*/
public function lastInsertId($name = null)
{
try {
if ($name === null) {
return $this->connection->lastInsertId();
}

return $this->connection->lastInsertId($name);
} catch (PDOException $exception) {
throw Exception::new($exception);
}
}

/**
* Begin a new database transaction.
*/
public function beginTransaction()
{
return $this->connection->beginTransaction();
}

/**
* Commit a database transaction.
*/
public function commit()
{
return $this->connection->commit();
}

/**
* Roll back a database transaction.
*/
public function rollBack()
{
return $this->connection->rollBack();
}

/**
* Wrap quotes around the given input.
*
* @param string $input
* @param string $type
* @return string
*/
public function quote($input, $type = ParameterType::STRING)
{
return $this->connection->quote($input, $type);
}

/**
* Get the server version for the connection.
*
* @return string
*/
public function getServerVersion()
{
return $this->connection->getAttribute(PDO::ATTR_SERVER_VERSION);
}

/**
* Get the wrapped PDO connection.
*/
public function getWrappedConnection(): PDO
{
return $this->connection;
}

/**
* Create a new statement instance.
*/
protected function createStatement(PDOStatement $stmt): Statement
{
return new Statement($stmt);
}
}
20 changes: 20 additions & 0 deletions src/database/src/DBAL/MySqlDriver.php
@@ -0,0 +1,20 @@
<?php

declare(strict_types=1);
/**
* This file is part of Hyperf.
*
* @link https://www.hyperf.io
* @document https://hyperf.wiki
* @contact group@hyperf.io
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
*/
namespace Hyperf\Database\DBAL;

use Doctrine\DBAL\Driver\AbstractMySQLDriver;
use Hyperf\Database\DBAL\Concerns\ConnectsToDatabase;

class MySqlDriver extends AbstractMySQLDriver
{
use ConnectsToDatabase;
}
4 changes: 2 additions & 2 deletions src/database/src/MySqlConnection.php
Expand Up @@ -11,7 +11,7 @@
*/
namespace Hyperf\Database;

use Doctrine\DBAL\Driver\PDO\MySQL\Driver as DoctrineDriver;
use Hyperf\Database\DBAL\MySqlDriver;
use Hyperf\Database\Query\Grammars\MySqlGrammar as QueryGrammar;
use Hyperf\Database\Query\Processors\MySqlProcessor;
use Hyperf\Database\Schema\Grammars\MySqlGrammar as SchemaGrammar;
Expand Down Expand Up @@ -81,6 +81,6 @@ protected function getDefaultPostProcessor()
*/
protected function getDoctrineDriver()
{
return new DoctrineDriver();
return new MySqlDriver();
}
}

0 comments on commit fecdb50

Please sign in to comment.