ifcanduela / db
1.6.0
2022-12-13 20:24 UTC
Requires
- php: >=8.1
- ext-json: *
- ext-pdo: *
Requires (Dev)
- phpunit/phpunit: *
- vimeo/psalm: ^4.4
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.