minphp/record

数据库访问库

3.1.2 2023-05-26 17:26 UTC

This package is auto-updated.

Last update: 2024-09-15 01:30:17 UTC


README

Build Status Coverage Status

数据库访问库。

提供了一种流畅的接口,用于生成和执行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 NULLIS 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();
}