minphp / record
数据库访问库
3.1.2
2023-05-26 17:26 UTC
Requires
- php: >=5.3.0
- minphp/db: ~2.0
Requires (Dev)
- phpunit/phpunit: ~4.0
- squizlabs/php_codesniffer: ~2.2
README
数据库访问库。
提供了一种流畅的接口,用于生成和执行SQL查询。
安装
使用composer安装
composer require minphp/record:~1.0
使用
首先,初始化您的连接
use Minphp\Record\Record; $dbInfo = array( 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'databasename', 'user' => 'user', 'pass' => 'pass' ); $record = new Record($dbInfo);
选择
选择语句必须以以下之一结束
fetch()
获取单个记录fetchAll()
获取所有记录getStatement()
获取\PDOStatement
对象,您可以对其实例化get()
获取SQL查询
所有
$users = $record->select() ->from('users') ->fetchAll();
元组
$users = $record->select(array('id', 'name', 'email')) ->from('users') ->fetchAll();
元组别名
$users = $record->select(array('id', 'name', 'email' => 'login')) ->from('users') ->fetchAll();
值注入
$users = $record->select(array('id', 'name', 'email' => 'login')) ->select(array('\'active\'' => 'status'), false) ->from('users') ->fetchAll();
聚合函数
$users = $record->select(array('MAX(id)' => 'largestId')) ->from('users') ->fetch();
结果数量
$count = $record->select() ->from('users') ->numResults();
影响的行数
$count = $record->affectedRows();
最后插入ID
$id = $record->lastInsertId();
限制
限制10条记录
$users = $record->select() ->from('users') ->limit(10) ->fetchAll();
限制10条记录,从第20条记录开始
$users = $record->select() ->from('users') ->limit(10, 20) ->fetchAll();
排序
$users = $record->select() ->from('users') ->order(array('id' => 'asc')) ->fetchAll();
分组
$users = $record->select(array('email')) ->from('users') ->group(array('email')) ->fetchAll();
where
运算符包括
=
等于!=
,<>
不等于>
大于>=
大于等于<
小于<=
小于等于in
在给定值中notin
不在给定值中exists
存在于结果集中notexists
不存在于结果集中
注意: 如果null
作为值提供,则使用=
或!=
,结果变为IS NULL
或IS NOT NULL
。
简单Where
$users = $record->select() ->from('users') ->where('id', '=', 10) ->fetchAll();
和Where
$users = $record->select() ->from('users') ->where('id', '=', 10) ->where('name', '=', 'Roger Sherman') ->fetchAll();
或Where
$users = $record->select() ->from('users') ->where('id', '=', 10) ->orWhere('name', '=', 'Roger Sherman') ->fetchAll();
Where In
$users = $record->select() ->from('users') ->where('id', 'in', array(1, 2, 3, 4)) ->fetchAll();
简单Like
$users = $record->select() ->from('users') ->like('name', 'Roger%') ->fetchAll();
和Like
$users = $record->select() ->from('users') ->like('name', 'Roger%') ->like('email', '@domain.com') ->fetchAll();
或Like
$users = $record->select() ->from('users') ->like('name', 'Roger%') ->orLike('email', '@domain.com') ->fetchAll();
简单Having
$users = $record->select() ->from('users') ->having('name', '!=', null) ->fetchAll();
和Having
$users = $record->select() ->from('users') ->having('name', '!=', null) ->having('email', '!=', null) ->fetchAll();
或Having
$users = $record->select() ->from('users') ->having('name', '!=', null) ->orHaving('email', '!=', null) ->fetchAll();
条件分组
$users = $record->select() ->from('users') ->open() ->where('id', '>', 123) ->orWhere('email', '!=', null) ->close() ->where('name', '!=', null); ->fetchAll();
连接
每个连接方法支持一个条件。要添加更多条件,只需在连接前调用一个on()
。例如 on('column1', '=', 'column2', false)
。
内连接
$users = $record->select() ->from('users') ->innerJoin('user_groups', 'user_groups.id', '=', 'users.user_group_id', false) ->fetchAll();
内连接的第五个参数告诉连接,users.user_group_id
是一个字段,不是一个值。考虑以下,而不是
->innerJoin('user_groups', 'user_groups.id', '=', 5)
左连接
$users = $record->select() ->from('users') ->leftJoin('user_groups', 'user_groups.id', '=', 'users.user_group_id', false) ->fetchAll();
右连接
$users = $record->select() ->from('users') ->rightJoin('user_groups', 'user_groups.id', '=', 'users.user_group_id', false) ->fetchAll();
交叉连接
$users = $record->select() ->from('users') ->join('user_groups') ->fetchAll();
子查询
提示: 千万不要使用这些。子查询效率极低。这不是本库的限制,而是底层的关系数据库系统的限制。
所有子查询首先从子查询开始。思路是从内向外构建查询,并且随着每一层的添加,子查询成为父查询的一部分。
$usersQuery = $record->select() ->from('users') ->where('id', '=', 1234)->get(); $usersValues = $record->values; $record->reset(); $groups = $record->select() ->from('user_groups') ->appendValues($usersValues) ->innerJoin(array($usersQuery => 'temp'), 'temp.user_group_id', '=', 'user_groups.id', false) ->fetchAll(); /* SELECT * FROM user_groups INNER JOIN ( SELECT * FROM users WHERE id=1234 ) AS temp ON temp.user_group_id=user_groups.id */
插入
简单插入
$record->insert('users', array('name' => 'Roger Sherman'));
带过滤的插入
$record->insert( 'users', array('name' => 'Roger Sherman', 'bad_field' => 'will not be inserted'), array('name') );
重复
$record->duplicate('name' => 'Roger Sherman') ->insert( 'users', array('id' => 1776, 'name' => 'Roger Sherman') );
从查询中
$users = $record->select(array('id')) ->from('users'); $record->reset(); $record->insert('some_table', array('id' => $users));
更新
简单更新
$record->where('id', '=', 1776) ->update('users', array('name' => 'Roger Sherman'));
带过滤的更新
$record->where('id', '=', 1776) ->update( 'users', array('name' => 'Roger Sherman', 'bad_field' => 'will not be updated'), array('name') );
删除
简单删除
$record->from('users') ->delete();
多删除
$record->from('users') ->innerJoin('user_groups', 'user_groups.id', '=', 'users.user_group_id', false) ->where('user_groups.id', '=', 1) ->delete(array('users.*', 'user_groups.*'));
创建表
/** * Optionally set the character set and collation of the table being created * $record->setCharacterSet('utf8mb4'); * $record->setCollation('utf8mb4_unicode_ci'); */ $record->setField( 'id', array('type' => 'int', 'size' => 10, 'unsigned' => true, 'auto_increment' => true) ) ->setField('name', array('type' => 'varchar', 'size' => '128')) ->setField('emai', 'array('type' => 'varchar', 'size' => '255')) ->setKey(array('id'), 'primary') ->setKey(array('name'), 'index') ->create('users');
修改表
$record->setKey(array('name'), 'index', null, false) ->alter('users');
setKey
的第三个参数是索引名称。第四个参数标识这是添加还是删除。
截断
$record->truncate('users');
删除
$record->drop('users');
事务
try { $record->begin(); $record->insert('users', array('name' => 'Roger Sherman')); $record->commit(); } catch (\PDOException $e) { $record->rollBack(); }