pharako/mysql-dbal

Doctrine DBAL 的 MySQL 扩展

1.0.0 2020-10-14 04:28 UTC

This package is auto-updated.

Last update: 2024-09-26 17:51:10 UTC


README

Build Status Latest Stable Version Total Downloads Latest Unstable Version License

MySQL DBAL

Doctrine DBAL 的 MySQL 扩展。[a href="https://github.com/doctrine/dbal" rel="nofollow noindex noopener external ugc">Doctrine DBAL。

Pharako\DBAL\ConnectionDoctrine\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 字段将分别更新为 RabZabb,最后一个将插入。

$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 导致更新,则仅更新 wherewhen 字段。如果 upsert 导致插入,则包含所有字段。

小心使用 upserts

总的来说,针对具有不同结构的表执行 upserts 是安全的——那些包含单个唯一索引、多列唯一索引甚至多个唯一索引的表。

但是,由于 MySQL 中的 upserts 比简单的插入和更新更复杂,因此您不应期望这些方法在所有情况下都表现得相似(例如,在 upsert 的上下文中,LAST_INSERT_ID() 可能与插入时的行为略有不同)。

这就是为什么官方文档[官方文档链接]说,“通常,你应该尽量避免在具有多个唯一索引的表上使用ON DUPLICATE KEY UPDATE子句”,以及“[...] 对具有多个唯一键或主键的表执行INSERT ... ON DUPLICATE KEY UPDATE语句也被标记为不安全。”

尽管如此,在边缘情况下,upsert操作仍然会按预期工作。但是,如果你想更加安全,尽量加强测试,确保在upsert更新记录以及插入记录时都能得到预期结果。

开发

如果您想从您的工作站测试这个包,请检出开发环境

欢迎代码贡献和错误报告。对于拉取请求,请使用development分支。