pharako / mysql-dbal
Doctrine DBAL 的 MySQL 扩展
Requires
- php: >=7.2
- doctrine/dbal: ^2.10
Requires (Dev)
- codeception/codeception: ^2.2
This package is auto-updated.
Last update: 2024-09-26 17:51:10 UTC
README
MySQL DBAL
Doctrine DBAL 的 MySQL 扩展。[a href="https://github.com/doctrine/dbal" rel="nofollow noindex noopener external ugc">Doctrine DBAL。
Pharako\DBAL\Connection
是 Doctrine\DBAL\Connection
的扩展——从后者获得的所有功能也包含在前者中,并增加了一些针对与 MySQL 兼容的数据库的特定功能。
- 多行插入
- 单行和多行 upserts(如果存在则更新记录,否则插入)
支持的数据库
- MySQL
- MariaDB
要求
PHP 7.2 及以上。有关与 PHP < 7.2 兼容的先前版本的详细信息,请参阅 发布页面。
安装
通过 Composer 安装
$ composer require pharako/mysql-dbal
用法
实例化和配置
大多数 PHP 框架都将提供某种服务注入功能以帮助您进行配置,但您也可以手动进行。
手动
use Doctrine\Common\EventManager; use Doctrine\DBAL\Configuration; use Doctrine\DBAL\Driver\PDOMySql\Driver; use Pharako\DBAL\Connection; $params = [ 'dbname' => 'my_db', 'host' => 'localhost', 'user' => 'username', 'password' => '***', 'driver' => 'pdo_mysql' ]; $dbal = new Connection( $params, new Driver(), new Configuration(), new EventManager() );
Symfony 2 及以上
只需在 config.yml
中的 wrapper_class
下指定 DBAL 连接类。所有其他配置应保持不变。
doctrine: dbal: dbname: %database_name% host: %database_host% port: %database_port% user: %database_user% password: %database_password% driver: pdo_mysql wrapper_class: 'Pharako\DBAL\Connection'
有关 wrapper_class
和其他选项的更多信息,请参阅 Doctrine DBAL 配置。
额外功能
Pharako 的附加方法遵循 Doctrine 的 数据检索和操作 功能结构,包括 绑定类型。
多行插入
您可以通过一个调用插入多行记录——这将只访问数据库一次。
$data = [ [ 'name' => 'Foo', 'family_name' => 'Bar' ], [ 'name' => 'Fuzz', 'family_name' => 'Bazz' ] ]; $dbal->insert('my_table', $data);
或者,如果您想指定要插入的数据的类型
$dbal->insert('my_table', $data, [\PDO::PARAM_STR, \PDO::PARAM_STR]);
单行和多行 upserts(存在则更新,不存在则插入)
在您使用此功能之前,请确保您已阅读下面的 小心使用 upserts。
基于上一个示例,并假设 name
字段是表结构中的唯一键,前两个记录的 family_name
字段将分别更新为 Rab
和 Zabb
,最后一个将插入。
$data = [ [ 'name' => 'Foo', 'family_name' => 'Rab' ], [ 'name' => 'Fuzz', 'family_name' => 'Zabb' ], [ 'name' => 'New', 'family_name' => 'Foo' ] ]; $dbal->upsert('my_table', $data);
同样,这将只访问数据库一次。
如果您想使您的 upsert 仅更新几个列并保留所有其他列不变,您可以传递一个指定这些列的数组
$data = [ 'who' => 'Them', 'where' => 'There', 'when' => 'Sometime', 'why' => 'Because' ]; $dbal->upsert( 'another_table', $data, [\PDO::PARAM_STR, \PDO::PARAM_STR, \PDO::PARAM_STR, \PDO::PARAM_STR], ['where', 'when'] );
在此示例中,如果 upsert 导致更新,则仅更新 where
和 when
字段。如果 upsert 导致插入,则包含所有字段。
小心使用 upserts
总的来说,针对具有不同结构的表执行 upserts 是安全的——那些包含单个唯一索引、多列唯一索引甚至多个唯一索引的表。
但是,由于 MySQL 中的 upserts 比简单的插入和更新更复杂,因此您不应期望这些方法在所有情况下都表现得相似(例如,在 upsert 的上下文中,LAST_INSERT_ID()
可能与插入时的行为略有不同)。
这就是为什么官方文档[官方文档链接]说,“通常,你应该尽量避免在具有多个唯一索引的表上使用ON DUPLICATE KEY UPDATE
子句”,以及“[...] 对具有多个唯一键或主键的表执行INSERT ... ON DUPLICATE KEY UPDATE
语句也被标记为不安全。”
尽管如此,在边缘情况下,upsert操作仍然会按预期工作。但是,如果你想更加安全,尽量加强测试,确保在upsert更新记录以及插入记录时都能得到预期结果。
开发
如果您想从您的工作站测试这个包,请检出开发环境。
欢迎代码贡献和错误报告。对于拉取请求,请使用development
分支。