PHP查询构建器库

dev-master 2017-11-10 22:58 UTC

This package is not auto-updated.

Last update: 2024-09-28 20:46:00 UTC


README

简单的PHP数据库抽象库

连接到数据库

require 'path/to/Q/Q.php';
QF('mysql://user:pass@host/dbname') // setup dsn
    ->connect()                     // connect to database
    ->alias('default')              // set "default" alias
    ->tablePrefix('project__');     // set table prefix

连接到其他数据库并设置别名为“other-db”

QF('mysql://user:pass@host/dbname2?charset=utf8')->alias('other-db')->connect()->tablePrefix('bb__');

执行查询,获取行并释放结果

执行查询,获取第一行并释放结果

$res = Q('SELECT * FROM #users WHERE id = ?i', array(1));
$row = $res->row();

构建的查询

SELECT * FROM project__users WHERE id = 1

执行查询并获取每行。当所有行都获取完毕时,结果将自动释放。

$res = Q('SELECT * FROM #users');
while ($row = $res->each())
{
    print_r($row);
}

执行查询,获取所有行并释放结果

$all = Q('SELECT * FROM #users WHERE id > ?i AND id < ?i', array(0, 30))->all();
// get all rows, key in result array will be field ID
$all = Q('SELECT * FROM #users WHERE id > ?i AND id < ?i', array(0, 30))->all('id');

构建的查询

SELECT * FROM project__users WHERE id > 0 AND id < 30

使用一个模板插入数据集

Q('INSERT INTO #test VALUES (?i, ?s, ?x, ?e)
        ON DUPLICATE KEY UPDATE a = VALUES(a)*?x', array(
    array(10, 'str11', 'str12', 'a*10'),
    array(20, 'str21', 'str22', 'a*20'),
    50,
    array(30, 'str31', 'str32', 'a*30')
));

构建的查询

INSERT INTO project__test VALUES 
        (10, 'str11', 'str12', a*10), 
        (10, 'str21', 'str22', a*20), 
        (10, 'str31', 'str32', a*30)
    ON DUPLICATE KEY UPDATE
        a = VALUES(a)*50

WHERE
?i – 整数
?f – 浮点数
?b – 布尔值
?d – 日期
?t – 时间
?dt – 日期时间
?s – 字符串 (mysql_real_escape_string)
?x – 自动检测类型
?e – eval – 无变化
?li – 整数列表
?ls – 字符串列表

为带有IN的查询构建列表

使用?li修饰符构建整数值列表

$ids = array(1,3,5,7);
$res = Q('SELECT * FROM #test WHERE id IN(?li)', array($ids));

构建的查询

SELECT * FROM project__test WHERE id IN(1,3,5,7)

?ls修饰符下的字符串值列表:

$names = array('Anna', 'Bob');
$res = Q('SELECT * FROM #test WHERE name IN(?ls)', array($names));

构建的查询

SELECT * FROM project__test WHERE name IN('Anna', 'Bob')

在另一个数据库上执行查询,获取所有行并释放结果

$all = Q('other-db: SHOW TABLES')->all();

您可以将连接作为变量使用

$db = QF('mysql://user:pass@host/dbname?charset=utf8')->connect()->tablePrefix('aa__');
$all = $db->query('SELECT * FROM #registration_document_types')->all();

查询参数别名

您可以使用查询参数别名

Q('SELECT * FROM #table WHERE a = ?s:param1 AND b = ?i:param2', array(
        'param2' => 123,
        'param1' => 'some value'
);

构建的查询

SELECT * FROM #table WHERE a = 'some value' AND b = 123

您还可以使用传递参数的合并方法

Q('SELECT * FROM #table WHERE a = ?s:param1 AND b = ?i:param2 AND c = ?f', array(
        'param2' => 123,
        12.65,
        'param1' => 'some value'
);

构建的查询(如果未设置别名,则参数将通过array_shift获取)

SELECT * FROM #table WHERE a = 'some value' AND b = 123 AND c = 12.65

另一个例子

Q('INSERT INTO #table (a, b, c) VALUES 
                (?i:field_a, ?s:field_b, CONCAT(?x, ":", ?s:field_b))
        ON DUPLICATE KEY UPDATE a = VALUES(a) * ?x:multiplier', array(
    array(
        'field_a' => '1', 'field_b' => 'AAA 1', 1
    ),
    array(
        'field_a' => '2', 'field_b' => 'BBB 2', 2
    ),
    'multiplier' => 75,
    array(
        'field_a' => '3', 'field_b' => 'CCC 3', 3
    )
));

构建的查询

INSERT INTO seg__table (a, b, c) VALUES 
        (1, 'AAA 1', CONCAT(1, ":", 'AAA 1')), 
        (2, 'BBB 2', CONCAT(2, ":", 'BBB 2')), 
        (3, 'CCC 3', CONCAT(3, ":", 'CCC 3'))
    ON DUPLICATE KEY UPDATE 
        a = VALUES(a) * 75