gnf / gnfdb
数据库库
v0.1.10
2016-11-16 02:35 UTC
Requires
- doctrine/dbal: ^2.5
Requires (Dev)
- phpunit/phpunit: ^5
README
0. 安装
可以使用 composer 进行安装。
安装 ridibooks/platform-gnfdb 或 gnf/gnfdb 即可。
composer require ridibooks/platform-gnfdb
1. 连接方式
在 gnfdb 包内实例化 Gnf\db\PDO 即可使用。
Gnf\db\PDO 接收 \PDO 作为参数。创建连接并将其作为参数传递。
<?php $pdo_dbh = new PDO('mysql:host={host}', $user, $password); $db = new Gnf\db\PDO($pdo_dbh);
2. SELECT 相关
select 中使用的 method 列表如下。
- sqlDict / sqlDicts - 接收结果值为 array(PDO::FETCH_ASSOC)。
- sqlObject / sqlObjects - 接收结果值为 object(PDO::FETCH_OBJ)。
以上 method 的形式如下。
- sqlDict($sql, ...)
与 \PDO 的 prepare 和语法相同,但不支持 ":column:" 这样的 bind,只支持 "?" 这样的 bind。
单个取出的 sqlDict / sqlObject 在数据不存在时返回 null,多个取出的 sqlDicts / sqlObjects 在数据不存在时返回空数组。
使用示例
$db->sqlDict('SELECT * FROM tb_book WHERE id = ?', $b_id); $db->sqlDicts( 'SELECT * FROM tb_book INNER JOIN cpdp_books ON (tb_book.id = cpdp_books.b_id AND cpdp_books.approve_status = ?) WHERE tb_book.id = ? AND tb_book.pub_id = ?', ApproveStatus::OPEN, $b_id, $pud_ib );
3. WHERE 条件的扩展使用方法
可以直接指定 WHERE 条件并绑定 ?,但为了方便,提供了以下函数。
- sqlWhere($where)
$where 是 column => condition 形式的数组。
3.1 条件编写方法
- 简单比较直接使用值。
- 比较运算符使用以下函数的值。
sqlLesser($value)< $value
sqlLesserEqual($value)<= $value
sqlGreater($value)> $value
sqlGreaterEqual($value)>= $value
- 范围运算符
sqlBetween($start, $end)$start <= value <= $end
sqlRange($start, $end)$start <= b < $end
- like 语句的使用如下。
sqlLike($keyword)like '%{$keyword}%'
sqlLikeBegin($keyword)like '{$keyword}%'
条件编写示例
<?php //단순 비교 $db->sqlDict( 'SELECT * FROM tb_book WHERE ?', sqlWhere(['id' => $b_id]) ); // => SELECT * FROM tb_book WHERE id = {$b_id} //비교 연산자 $db->sqlDict( 'SELECT * FROM tb_book WHERE ?', sqlWhere(['pub_id' => sqlLesser($pub_id)]) ); // => SELECT * FROM tb_book WHERE pub_id < {$pub_id} //Between $db->sqlDict( 'SELECT * FROM tb_book WHERE ?', sqlWhere(['regdate' => sqlBetween('20160101000000', '20161231235959')]) ); // => SELECT * FROM tb_book WHERE regdate BETWEEN '20160101000000' AND '20161231235959' //like $db->sqlDict( 'SELECT * FROM tb_book WHERE ?', sqlWhere(['title' => sqlLike('체험판')]) ); // => SELECT * FROM tb_book WHERE title like '%체험판%'
- 简单比较时,如果比较目标是 array,则应用于 IN 查询。
比较目标为 array 的查询示例
<?php $b_ids = ['101000940', '101000941', '101000945']; $db->sqlDicts( 'SELECT * FROM tb_book WHERE ?', sqlWhere(['id' => $b_ids]) ); // => SELECT * FROM tb_book WHERE id IN ('101000940', '101000941', '101000945')
3.2 可用的函数
- sqlRaw($value)
- 直接使用输入的值。
- sqlLimit($count)
limit $count
- sqlLimit($from, $count)
limit $from, $count
- sqlNull()
- null 值,直接使用 null 也可以。
- sqlNot($value)
- 应用 Not。可以与其他运算符(如 sqlGreater)组合使用。
3.3 AND, OR 复合使用
前面提到的 sqlWhere 是使用 AND 编写的函数,而 sqlOr($where) 函数可以编写 OR 语句。
通过混合使用这两个函数,可以编写多种 WHERE 语句。
复合查询
<?php $where = [ 'tb_book.pub_id' => sqlNot(101), sqlOr( [ 'tb_book.category' => sqlNot( [ 4001, 4003 ] ) ], [ 'tb_book.serial_completed' => sqlNot('Y'), 'tb_book.series_id' => sqlNot('') ], ['tb_category.genre' => sqlNot('comic')], ['tb_book.is_setbook' => 'Y'] ) ]; $db->sqlDicts( 'SELECT tb_book.id FROM tb_book LEFT JOIN tb_book_comic ON (tb_book.id = tb_book_comic.b_id) LEFT JOIN tb_category ON (tb_book.category = tb_category.id) WHERE ?', sqlWhere($where) ); /* SELECT tb_book.id FROM tb_book LEFT JOIN tb_book_comic ON (tb_book.id = tb_book_comic.b_id) LEFT JOIN tb_category ON (tb_book.category = tb_category.id) WHERE tb_book.pub_id != 101 AND ( tb_book.category NOT IN (4001, 4003) OR ( tb_book.serial_completed != 'Y' AND tb_book.series_id != '' ) OR tb_category.genre != 'comic' OR tb_book.is_setbook = 'Y' ) */
3.4 扩展的表语句
可以直接在查询中编写表名,但只通过 JOIN 的 ON 条件连接的列编写,可以简单地创建 JOIN 查询。
支持的函数如下。
- sqlTable($table) - 单个表使用
- sqlJoin($tables) - JOIN 查询
- sqlLeftJoin($tables) - LEFT JOIN 查询
- sqlInnerJoin($tables) - INNER JOIN 查询
编写方法
- 表列表以数组的形式编写并使用。
- key 和 value 都编写为要 JOIN 的列。
- 最好使用之前声明的表作为 key 值。
- 第一个声明是 key 为 from 子句的表,而 value 为后续的 join 表。
- value 可以编写为单个表以进行单个 JOIN,也可以编写为数组以进行多个表 JOIN。
表语句编写示例
<?php // 단일 테이블 $db->sqlDict('SELECT * FROM ?', sqlTable('tb_book')); // => SELECT * FROM tb_book // join 테이블 - 1:1 관계만 $tables = [ 'tb_book.id' => 'tb_book_comic.b_id', 'tb_book.category' => 'tb_category.id' ]; $db->sqlDicts('SELECT * FROM ?', sqlLeftJoin($tables)); /* SELECT * FROM tb_book LEFT JOIN tb_book_comic ON (tb_book.id = tb_book_comic.b_id) LEFT JOIN tb_category ON (tb_book.category = tb_category.id) */ // join 테이블 - 첫 테이블에 join이 여러개 걸리는 경우 $tables = [ 'tb_book_production.b_id' => ['tb_book.id', 'platform_withhold.b_id'], 'tb_book.pub_id' => 'tb_publisher.id', 'tb_publisher.id' => 'tb_publisher_manager.pub_id', 'tb_book.id' => 'tb_book_search.b_id' ]; $db->sqlDicts('SELECT * FROM ?', sqlLeftJoin($tables)); /* SELECT * FROM tb_book_production LEFT JOIN tb_book ON (tb_book_production.b_id = tb_book.id) LEFT JOIN platform_withhold ON (tb_book_production.b_id = production_withhold.b_id) LEFT JOIN tb_publisher ON (tb_book.pub_id = tb_publisher.id) LEFT JOIN tb_publisher_manager ON (tb_publisher.id = tb_publisher_manager.pub_id) LEFT JOIN tb_book_search ON (tb_book.id = tb_book_search.b_id) */
3.5 其他
- sqlAdd($something) - column + $something 查询转换
- sqlStrcat($something) - concat(colum, $something) 查询转换
- sqlPassword($something) - sql password() 函数
- sqlColumn($column) - 想要安全地使用列名时
- sqlWhereWithClause($where) - 与 sqlWhere() 相同,但 'WHERE' 在条件语句之前先出现。
- sqlRange($A, $B) - $a <= column < $b
- sqlNow() - sql now() 函数
4. CRUD
CRUD 支持以下 method。
- sqlInsert(table, data)
- sqlUpdate(table, data, where);
- sqlDelete(table, where)
- sqlInsertOrUpdate(table, data, update_where = null) - INSERT INTO ~~ ON DUPLICATE KEY UPDATE 구문
变量如下。
- table - 单个表名(未应用sqlTable)
- data - 要添加/更新的数据数组,以 column => value 的形式构成
- where, update_where - 条件语句(sqlWhere可以不使用)
5. 事务
事务支持以下两种方法。
-
transactional
-
$success = $db->transactional(function($db) { $db->sqlDo($sql); });
-
-
sqlBegin-sqlEnd
-
$db->sqlBegin(); dbQueries($db); $success = $db->sqlEnd();
-
sqlEnd可以用sqlCommit、sqlRollback方法代替。
-
6. 其他等
已编写的方法列表
sqlDo($sql, ...)- 简单执行sqlCount($table, $where)- SELECT count(*) FROM ~~ 的缩写形式sqlData($sql, ...)- 与Dict/Object不同,仅提取SELECT子句的第一个列,值为null时返回nullsqlDatas($sql, ...)- 与上相同,值为null时返回空数组sqlArray($sql, ...)- 与Dict相似,但key值以数字输入(PDO::FETCH_NUM)sqlArrays($sql, ...)- 与Dictionaries相似,与上相同sqlLine($sql, ...)- 与sqlArray相同sqlLines($sql, ...)- 与sqlArrays相同sqlDump($sql, ...)- 返回查询解析的结果值sqlDumpBegin(); sqlDo($sql, ...); sqlDumpEnd()- 在sqlDo调用时执行的query可以在sqlDumpEnd中获取。