PHP 数据库抽象层(DBAL)

v2.1.0 2018-10-03 12:25 UTC

This package is auto-updated.

Last update: 2024-09-09 19:24:13 UTC


README

GitHub (pre-)release GitHub license

PHP 数据库抽象库,具有 ActiveRecord 功能。它基于 PDO 扩展。

要求

  • PHP 7.1.0+
  • PDO 驱动程序
  • 启用的扩展:pdo_pgsql 和/或 pdo_mysql

安装

通过 Composer 安装是推荐的安装方式。将以下行添加到您的 composer.json 文件中

"dawidgorecki/dbal": "~2.0"

或运行

composer require dawidgorecki/dbal

使用

配置

use Reven\DBAL\Configuration\DBConfig;
use Reven\DBAL\Configuration\DSN;

$dsn = new DSN(DSN::DRIVER_PGSQL, 'my_db');
// $dsn = new DSN(DSN::DRIVER_MYSQL, 'my_db', 'localhost', DSN::PORT_MYSQL);

$config = new DBConfig($dsn, 'username', 'passwd');
// $config = new DBConfig($dsn, 'username', 'passwd', 'utf8', true);

获取连接和 DBAL 实例

使用连接管理器

use Reven\DBAL\ConnectionManager;
use Reven\DBAL\DBALDatabase;
use Reven\DBAL\Exceptions\DBALException;

try {
    ConnectionManager::createConnection($config);
    // ConnectionManager::createConnection($config1, 'db1', PDO::FETCH_ASSOC);
    // ConnectionManager::createConnection($config2, 'db2', PDO::FETCH_OBJ);
} catch (DBALException $e) {
    die($e);
}

$dbal = new DBALDatabase(ConnectionManager::getConnection());
// $dbal = new DBALDatabase(ConnectionManager::getConnection('db1'));

使用数据库工厂

use Reven\DBAL\DatabaseFactory;
use Reven\DBAL\DBALDatabase;
use Reven\DBAL\Exceptions\DBALException;

try {
    $pdo = DatabaseFactory::getConnection($config, PDO::FETCH_ASSOC);
} catch (DBALException $e) {
    die($e);
}

$dbal = new DBALDatabase($pdo);

错误 & 异常

您可以通过在对象构造函数中将第二个参数设置为 false 来关闭 DBALDatabase 抛出的所有异常。

$dbal = new DBALDatabase($pdo, false);

获取错误信息和查询字符串

$dbal->getLastError();
$dbal->getQueryString();

DBAL API

getPDO()

返回一个表示数据库连接的 PDO 实例

$dbal->getPDO();

startTransaction()

初始化一个事务(关闭自动提交模式)

$dbal->startTransaction();

commit()

提交事务,将数据库连接返回到自动提交模式

$dbal->commit();

rollback()

回滚当前事务

$dbal->rollback();

fetchAll()

返回查询结果的全部行

$users = $dbal->fetchAll("SELECT * FROM users");
    
/* 
Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Dawid
            [age] => 31
        )
)
*/

fetchFirst()

返回查询结果的第一行

$user = $dbal->fetchFirst("SELECT * FROM users ORDER BY id", [], PDO::FETCH_ASSOC);
    
/*
Array
(
    [id] => 1
    [name] => Dawid
    [age] => 31
)
*/

fetchArray()

以数字索引数组的形式返回查询结果的第一行

$user = $dbal->fetchArray("SELECT * FROM users ORDER BY id");
    
/*
Array
(
    [0] => 1
    [1] => Dawid
    [2] => 31
)
*/

fetchAssoc()

以关联数组的形式返回查询结果的第一行

$user = $dbal->fetchAssoc("SELECT * FROM users WHERE name = ?", ["Dawid"]);
    
/*
Array
(
    [id] => 1
    [name] => Dawid
    [age] => 31
)
*/

fetchColumn()

从查询结果的第一行返回单个列

$user = $dbal->fetchColumn("SELECT * FROM users WHERE id = ?", [1], 1);

// Dawid

delete()

删除给定表中的行

$dbal->delete('users', ["id" => 1]);
$dbal->delete('users', ["name" => "Dawid"]);

insert()

将行插入给定表

$dbal->insert('users', ["name" => "John", "age" => 35]);

update()

更新给定表中的行

$dbal->update('users', ["name" => "New John", "age" => 40], ["id" => 15]);

executeQuery()

执行带有给定 SQL 和参数的预处理语句,并返回 PDOStatement 实例

$stmt = $dbal->executeQuery("SELECT * FROM users");

while ($user = $stmt->fetchObject()) {
    print_r($user);
}

/*
stdClass Object
(
    [id] => 1
    [name] => Dawid
    [age] => 31
)
stdClass Object
(
    [id] => 15
    [name] => New John
    [age] => 40
)
*/

updateQuery()

执行带有给定 SQL 和参数的预处理语句,并返回受影响的行数

$rows_affected = $dbal->updateQuery("DELETE FROM users WHERE name = ?", ["New John"]);

prepare()

准备给定的 SQL 语句并返回 PDOStatement 实例

$stmt = $dbal->prepare("SELECT * FROM users WHERE name LIKE 'D%'");
$stmt->execute();

while ($user = $stmt->fetch(PDO::FETCH_NUM)) {
    print_r($user);
}

/*
Array
(
    [0] => 1
    [1] => Dawid
    [2] => 31
)
Array
(
    [0] => 12
    [1] => Dominik
    [2] => 1
)
*/

quote()

为查询中的使用引用字符串

$quoted = $dbal->quote("Hello", PDO::PARAM_STR);

lastId()

返回最后插入行的 ID

$last_id = $dbal->lastId();

ActiveRecord

模型私有属性应与数据库表中的列名相同。

命名约定

  • 数据库表 - 单词间使用下划线分隔的复数形式(例如,user_details)
  • 模型类 - 单数形式,每个单词的首字母大写(例如,UserDetail)

使用

通过 Reven\DBAL\ActiveRecord 扩展您的模型类

<?php

namespace Reven\DBAL;

class User extends ActiveRecord
{
}

创建数据库连接

ConnectionManager::createConnection($config, 'active_record');

设置连接名称(如果非默认)

User::setConnectionName('active_record');

更改默认数据库表(可选)

User::setTableName('employers');

基本 CRUD

创建

要在数据库中创建新记录(例如,添加新用户),我们实例化一个新对象,然后调用 save() 方法。

// INSERT INTO users(name,email) VALUES('John','john@gmail.com')  
$user = new User();
$user->setName("John");
$user->setEmail("john@gmail.com");
$user->save();

读取

这些是您查找和检索数据库记录的基本方法。

// SELECT * FROM users WHERE id=1 LIMIT 1
$user = User::findById(1);
echo $user->getName();

// SELECT * FROM users
$users = User::findAll();
foreach ($users as $user) {
    echo $user->getName();
}

// SELECT * FROM users WHERE email='john@gmail.com'
$users = User::findByQuery("SELECT * FROM users WHERE email=:email", [":email" => "john@gmail.com"]);
echo $users[0]->getName();

更新

要更新,您只需先找到记录,然后更改其中一个属性。

// UPDATE users SET name='Edwin' WHERE id=1
$user = User::findById(1);
$user->setName("Edwin");
$user->save();

删除

这将调用 SQL 查询以删除数据库中的记录。

// DELETE FROM users WHERE id=1
$user = User::findById(1);
$user->delete();

许可证

根据 MIT 许可证授权。 (https://open-source.org.cn/licenses/MIT)