1.6.0 2022-12-13 20:24 UTC

This package is auto-updated.

Last update: 2024-09-14 00:24:54 UTC


README

SQLite和MySQL的一个易于使用的数据库连接管理器和查询构建器。

入门

使用Composer安装。

连接到数据库

ifcanduela\db\Database类继承自PDO,但包括两个静态方法来连接MySQL和SQLite

require __DIR__ . '/vendor/autoload.php';

use ifcanduela\db\Database;

$sqlite = Database::sqlite($filename, $options);
$mysql  = Database::mysql($host, $dbname, $user, $password, $options);

参数与PDO构造函数中的参数匹配。

使用静态工厂创建连接时,默认设置以下选项

  • PDO在出错时将抛出异常。
  • 结果将返回为关联数组。
  • 将不会模拟预处理语句。

使用数组创建连接

连接也可以使用数组创建

$mysql = Database::fromArray([
        'engine' => 'mysql',
        'host' => '127.0.0.1',
        'name' => 'some_database',
        'user' => 'some_username',
        'pass' => 'some_password',
    ]);

$sqlite = Database::fromArray([
        'engine' => 'sqlite',
        'file' => './db.sqlite',
    ]);

查询构建器

require __DIR__ . '/vendor/autoload.php';

use ifcanduela\db\Query;

$query = Query::select()
    ->columns('users.*')
    ->from('users')
    ->leftJoin('profiles', ['users.id' => 'profiles.user_id'])
    ->where(['status' => ['<>', 1]])
    ->orderBy('created DESC', 'username')
    ->limit(1, 2);

echo $query; // or $query->getSql();
// SELECT users.*
// FROM users LEFT JOIN profiles ON users.id = profiles.user_id
// WHERE status <> :_param_1
// ORDER BY created DESC, username
// LIMIT 2, 1;

您可以通过在$query对象上调用getParams()来获取预处理语句的参数。

运行查询

当您有一个连接并构建了一个查询时,您可以在连接上调用run方法来运行查询

$sqlite->run($query);

这相当于以下内容

$sqlite->query($query->getSql(), $query->getParams());

记录查询

通过run()方法运行的查询可以使用实现LoggerInterface的对象进行记录。查询日志条目使用Logger::INFO级别。例如,使用Monolog

use ifcanduela\db\Database;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$logger = new Logger('Query log');
$file_handler = new StreamHandler('queries.log', Logger::INFO);
$logger->pushHandler($file_handler);

$db = Database::sqlite(':memory');
$db->setLogger($logger);

$db->run('SELECT 1');

查询构建器API

选择查询

Query::select(string ...$field)
    ->distinct(bool $enable = true)
    ->columns(string ...$column)
    ->from(string ...$table)
    ->join(string $table, array $on)
    ->innerJoin(string $table, array $on)
    ->leftJoin(string $table, array $on)
    ->leftOuterJoin(string $table, array $on)
    ->rightJoin(string $table, array $on)
    ->outerJoin(string $table, array $on)
    ->fullOuterJoin(string $table, array $on)
    ->where(array $conditions)
    ->andWhere(array $conditions)
    ->orWhere(array $conditions)
    ->groupBy(string ...$field)
    ->having(array $conditions)
    ->andHaving(array $conditions)
    ->orHaving(array $conditions)
    ->orderBy(string ...$field)
    ->limit(int $limit, int $offset = null)
    ->offset(int $offset)
    ->getSql()
    ->getParams()

还有一个Query::count()方法,它将自动选择COUNT(*)列。

插入查询

Query::insert(string $table = null)
    ->table(string $table)
    ->into(string $table)
    ->values(array ...$values)
    ->getSql()
    ->getParams()

更新查询

Query::update(string $table = null)
    ->table(string $table)
    ->set(array $values)
    ->where(array $conditions)
    ->andWhere(array $conditions)
    ->orWhere(array $conditions)
    ->getSql()
    ->getParams()

删除查询

Query::delete(string $table = null)
    ->table(string $table)
    ->where(array $conditions)
    ->andWhere(array $conditions)
    ->orWhere(array $conditions)
    ->getSql()
    ->getParams()

指定条件

通过使用where()andWhere()orWhere()方法(或它们的分组等效方法,having()andHaving()orHaving())来构建条件。条件必须是关联数组,其中键是预期的比较中的列名,而左侧值是值或操作符和值的索引数组。

除非您在它们上使用ifcanduela\db\qi()函数,否则值将转换为预处理语句参数。

一个带有多个条件的选择查询的示例将是这个

$q = Query::select();

$q->columns('id', 'name', 'age');
$q->from('users');
$q->where(['id' => 1]);
$q->orWhere(['id' => 3]);
$q->andWhere(['age' => ['>', 18]]);
$q->orderBy('age DESC');

生成的SQL将类似于以下片段

SELECT id, name, age 
FROM users 
WHERE (id = :p_1 OR id = :p_2) AND age > :p_3
ORDER BY age DESC

参数数组看起来像这样

[
    ":p_1" => 1,
    ":p_2" => 3,
    ":p_3" => 18,
]

复杂条件

如果使用where()方法令人困惑或不足,您可以使用简单的数组来指定嵌套条件

$q = Query::select()->where([
        'AND',
        'a' => 1,
        'b' => 2,
        [
            'OR',
            'c' => 3,
            'd' => 4,
        ]
    ]);

这将导致类似以下内容

SELECT *
FROM users 
WHERE a = :p_1 AND b = :p_2 AND (c = :p_3 OR d = :p_4)

许可

MIT.