cakephp/database
Composer 安装命令:
composer require cakephp/database
包简介
Flexible and powerful Database abstraction library with a familiar PDO-like API
README 文档
README
A flexible and lightweight Database Library for PHP
This library abstracts and provides help with most aspects of dealing with relational databases such as keeping connections to the server, building queries, preventing SQL injections, inspecting and altering schemas, and with debugging and profiling queries sent to the database.
It adopts the API from the native PDO extension in PHP for familiarity, but solves many of the inconsistencies PDO has, while also providing several features that extend PDO's capabilities.
A distinguishing factor of this library when compared to similar database connection packages, is that it takes the concept of "data types" to its core. It lets you work with complex PHP objects or structures that can be passed as query conditions or to be inserted in the database.
The typing system will intelligently convert the PHP structures when passing them to the database, and convert them back when retrieving.
Connecting to the database
This library is able to work with the following databases:
- MySQL
- Postgres
- SQLite
- Microsoft SQL Server (2008 and above)
The first thing you need to do when using this library is create a connection object. Before performing any operations with the connection, you need to specify a driver to use:
use Cake\Database\Connection; use Cake\Database\Driver\Mysql; use Cake\Database\Driver\Sqlite; $connection = new Connection([ 'driver' => Mysql::class, 'database' => 'test', 'username' => 'root', 'password' => 'secret', ]); $connection2 = new Connection([ 'driver' => Sqlite::class, 'database' => '/path/to/file.db' ]);
Drivers are classes responsible for actually executing the commands to the database and correctly building the SQL according to the database specific dialect.
Connection options
This is a list of possible options that can be passed when creating a connection:
driver: Driver class namepersistent: Creates a persistent connectionhost: The server hostdatabase: The database nameusername: Login credentialpassword: Connection secretencoding: The connection encoding (or charset)timezone: The connection timezone or time offset
Using connections
After creating a connection, you can immediately interact with the database. You can choose
either to use the shorthand methods execute(), insert(), update(), delete() or use
one of selectQuery(), updateQuery(), insertQuery() or deleteQuery()
to get a query builder for particular type of query.
The easiest way of executing queries is by using the execute() method, it will return a
Cake\Database\StatementInterface that you can use to get the data back:
$statement = $connection->execute('SELECT * FROM articles'); while($row = $statement->fetch(\PDO::FETCH_ASSOC)) { echo $row['title'] . PHP_EOL; }
Binding values to parametrized arguments is also possible with the execute function:
$statement = $connection->execute('SELECT * FROM articles WHERE id = :id', ['id' => 1], ['id' => 'integer']); $results = $statement->fetch(\PDO::FETCH_ASSOC);
The third parameter is the types the passed values should be converted to when passed to the database. If no types are passed, all arguments will be interpreted as a string.
Alternatively you can construct a statement manually and then fetch rows from it:
$statement = $connection->prepare('SELECT * from articles WHERE id != :id'); $statement->bind(['id' => 1], ['id' => 'integer']); $results = $statement->fetchAll(\PDO::FETCH_ASSOC);
The default types that are understood by this library and can be passed to the bind() function or to execute()
are:
- biginteger
- binary
- date
- float
- decimal
- integer
- time
- datetime
- timestamp
- uuid
More types can be added dynamically in a bit.
Statements can be reused by binding new values to the parameters in the query:
$statement = $connection->prepare('SELECT * from articles WHERE id = :id'); $statement->bind(['id' => 1], ['id' => 'integer']); $results = $statement->fetchAll(\PDO::FETCH_ASSOC); $statement->bind(['id' => 1], ['id' => 'integer']); $results = $statement->fetchAll(\PDO::FETCH_ASSOC);
Updating Rows
Updating can be done using the update() function in the connection object. In the following
example we will update the title of the article with id = 1:
$connection->update('articles', ['title' => 'New title'], ['id' => 1]);
The concept of data types is central to this library, so you can use the last parameter of the function to specify what types should be used:
$connection->update( 'articles', ['title' => 'New title'], ['created >=' => new DateTime('-3 day'), 'created <' => new DateTime('now')], ['created' => 'datetime'] );
The example above will execute the following SQL:
UPDATE articles SET title = 'New Title' WHERE created >= '2014-10-10 00:00:00' AND created < '2014-10-13 00:00:00';
More on creating complex where conditions or more complex update queries later.
Deleting Rows
Similarly, the delete() method is used to delete rows from the database:
$connection->delete('articles', ['created <' => DateTime('now')], ['created' => 'date']);
Will generate the following SQL
DELETE FROM articles where created < '2014-10-10'
Inserting Rows
Rows can be inserted using the insert() method:
$connection->insert( 'articles', ['title' => 'My Title', 'body' => 'Some paragraph', 'created' => new DateTime()], ['created' => 'datetime'] );
More complex updates, deletes and insert queries can be generated using the Query class.
Query Builder
One of the goals of this library is to allow the generation of both simple and complex queries with ease. The query builder can be accessed by getting a new instance of a query:
$query = $connection->selectQuery();
Selecting Fields
Adding fields to the SELECT clause:
$query->select(['id', 'title', 'body']); // Results in SELECT id AS pk, title AS aliased_title, body ... $query->select(['pk' => 'id', 'aliased_title' => 'title', 'body']); // Use a closure $query->select(function ($query) { return ['id', 'title', 'body']; });
Where Conditions
Generating conditions:
// WHERE id = 1 $query->where(['id' => 1]); // WHERE id > 1 $query->where(['id >' => 1]);
As you can see you can use any operator by placing it with a space after the field name. Adding multiple conditions is easy as well:
$query->where(['id >' => 1])->andWhere(['title' => 'My Title']); // Equivalent to $query->where(['id >' => 1, 'title' => 'My title']);
It is possible to generate OR conditions as well
$query->where(['OR' => ['id >' => 1, 'title' => 'My title']]);
For even more complex conditions you can use closures and expression objects:
$query->where(function (ExpressionInterface $exp) { return $exp ->eq('author_id', 2) ->eq('published', true) ->notEq('spam', true) ->gt('view_count', 10); });
Which results in:
SELECT * FROM articles WHERE author_id = 2 AND published = 1 AND spam != 1 AND view_count > 10
Combining expressions is also possible:
$query->where(function (ExpressionInterface $exp) { $orConditions = $exp->or(['author_id' => 2]) ->eq('author_id', 5); return $exp ->not($orConditions) ->lte('view_count', 10); });
That generates:
SELECT * FROM articles WHERE NOT (author_id = 2 OR author_id = 5) AND view_count <= 10
When using the expression objects you can use the following methods to create conditions:
eq()Creates an equality condition.notEq()Create an inequality conditionlike()Create a condition using the LIKE operator.notLike()Create a negated LIKE condition.in()Create a condition using IN.notIn()Create a negated condition using IN.gt()Create a > condition.gte()Create a >= condition.lt()Create a < condition.lte()Create a <= condition.isNull()Create an IS NULL condition.isNotNull()Create a negated IS NULL condition.
Aggregates and SQL Functions
// Results in SELECT COUNT(*) count FROM ... $query->select(['count' => $query->func()->count('*')]);
A number of commonly used functions can be created with the func() method:
sum()Calculate a sum. The arguments will be treated as literal values.avg()Calculate an average. The arguments will be treated as literal values.min()Calculate the min of a column. The arguments will be treated as literal values.max()Calculate the max of a column. The arguments will be treated as literal values.count()Calculate the count. The arguments will be treated as literal values.concat()Concatenate two values together. The arguments are treated as bound parameters unless marked as literal.coalesce()Coalesce values. The arguments are treated as bound parameters unless marked as literal.dateDiff()Get the difference between two dates/times. The arguments are treated as bound parameters unless marked as literal.now()Take either 'time' or 'date' as an argument allowing you to get either the current time, or current date.
When providing arguments for SQL functions, there are two kinds of parameters you can use, literal arguments and bound parameters. Literal parameters allow you to reference columns or other SQL literals. Bound parameters can be used to safely add user data to SQL functions. For example:
$concat = $query->func()->concat([ 'title' => 'literal', ' NEW' ]); $query->select(['title' => $concat]);
The above generates:
SELECT CONCAT(title, :c0) ...;
Other SQL Clauses
Read of all other SQL clauses that the builder is capable of generating in the official API docs
Getting Results out of a Query
Once you’ve made your query, you’ll want to retrieve rows from it. There are a few ways of doing this:
// Iterate the query foreach ($query as $row) { // Do stuff. } // Get the statement and fetch all results $results = $query->execute()->fetchAll(\PDO::FETCH_ASSOC);
Official API
You can read the official official API docs to learn more of what this library has to offer.
cakephp/database 适用场景与选型建议
cakephp/database 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 26.63M 次下载、GitHub Stars 达 98, 最近一次更新时间为 2015 年 01 月 02 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「database」 「abstraction」 「cakephp」 「pdo」 「database abstraction」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 cakephp/database 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 cakephp/database 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 cakephp/database 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
CakePHP 4.x AdminLTE Theme.
Dibi is Database Abstraction Library for PHP
Store your language lines in the database, yaml or other sources
Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.
ADOdb is a PHP database abstraction layer library
A package for automatically encrypting and decrypting Eloquent attributes in Laravel 5.5+, based on configuration settings.
统计信息
- 总下载量: 26.63M
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 105
- 点击次数: 16
- 依赖项目数: 28
- 推荐数: 1
其他信息
- 授权协议: MIT
- 更新时间: 2015-01-02