Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed doctrine/dbal does not works. #3141

Merged
merged 2 commits into from Jan 15, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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();
}
}