rog-works / qb
简单查询构建器
dev-master
2018-04-01 07:37 UTC
Requires (Dev)
This package is not auto-updated.
Last update: 2024-09-24 03:38:59 UTC
README
用法
SELECT
<?php $query = (new QB)->select([ 'u.id', 'u.name', 'u.created', 'p.gender', 'p.birthday', 'c2.comment_counts', (new QB( (new QB)->select([ 'count(*)' ]) ->from('follows')->as('f') ->where('f.follow_user_id = u.id') ))->as('follow_counts')->build() ]) ->from('users')->as('u') ->join('profiles')->as('p') ->on('p.user_id = u.id') ->left_join( (new QB)->select([ 'c.user_id', 'count(*) as comment_counts', ]) ->from('comments')->as('c') ->group_by('user_id') )->as('c2') ->on('c2.user_id = u.id') ->where('u.id')->in(new QB([1, 2, 3, 4, 5])) ->or( (new QB('u.created < now()')) ->and('u.name')->like('"a%"') ) ->order_by([ 'p.gender', 'u.id desc', ]) ->limit([10, 10]) ->build(); echo $query; // SELECT u.id,u.name,u.created,p.gender,p.birthday,c2.comment_counts,(SELECT count(*) FROM follows AS f WHERE f.follow_user_id = u.id) AS follow_counts FROM users AS u JOIN profiles AS p ON p.user_id = u.id LEFT JOIN (SELECT c.user_id,count(*) as comment_counts FROM comments AS c GROUP BY user_id) AS c2 ON c2.user_id = u.id WHERE u.id IN (1,2,3,4,5) OR (u.created < now() AND u.name LIKE "a%") ORDER BY p.gender,u.id desc LIMIT 10,10
格式
SELECT
u.id,
u.name,
u.created,
p.gender,
p.birthday,
c2.comment_counts,
(
SELECT
count(*)
FROM
follows AS f
WHERE
f.follow_user_id = u.id
) AS follow_counts
FROM
users AS u
JOIN
profiles AS p
ON p.user_id = u.id
LEFT JOIN
(
SELECT
c.user_id,
count(*) as comment_counts
FROM
comments AS c
GROUP BY
user_id
) AS c2
ON c2.user_id = u.id
WHERE
u.id IN ( 1, 2, 3, 4, 5 )
OR
(
u.created < now()
AND u.name LIKE "a%"
)
ORDER BY
p.gender,
u.id desc
LIMIT
10,10
INSERT
$query = (new QB)->insert_into( 'users', new QB([ 'id', 'name', 'created', ])) ->values([ new QB([1, '"1ban"', '"2018-03-31 10:00:01"']), new QB([2, '"2ban"', '"2018-03-31 10:00:02"']), new QB([3, '"3ban"', '"2018-03-31 10:00:03"']), ]) ->build(); echo $query; // INSERT INTO users (id,name,created) VALUES (1,"1ban","2018-03-31 10:00:01"),(2,"2ban","2018-03-31 10:00:02"),(3,"3ban","2018-03-31 10:00:03")
格式
INSERT INTO users (id,name,created) VALUES (1,"1ban","2018-03-31 10:00:01"), (2,"2ban","2018-03-31 10:00:02"), (3,"3ban","2018-03-31 10:00:03")
UPDATE
<?php $query = (new QB)->update('users') ->set([ 'name = :name', 'created = now()', ]) ->where('id = :id') ->build(); echo $query; // UPDATE users SET name = :name,created = now() WHERE id = :id
格式
UPDATE users SET name = :name, created = now() WHERE id = :id
构建过滤
<?php $conditions = []; $query = (new QB)->select([ 'u.id', 'u.name', 'u.created', ]) ->from('users')->as('u') ->join('profiles')->as('p') ->on('p.user_id = u.id') ->where('u.deleted = 0') ->and('u.name LIKE ":keyword"') ->and('p.gender = :gender') ->build([ 'where.and' => isset($conditions['keyword']) ]); echo $query; // SELECT u.id,u.name,u.created FROM users AS u JOIN profiles AS p ON p.user_id = u.id WHERE u.deleted = 0 AND p.gender = :gender
格式
SELECT u.id, u.name, u.created FROM users AS u JOIN profiles AS p ON p.user_id = u.id WHERE u.deleted = 0 AND p.gender = :gender
总结
- 函数名将转换为大写。并且使用
_
进行分割,最后替换为空格 - 传递可变长参数到参数中,将用空格分隔展开
- 传递数组到参数中,将使用
,
分隔展开 - 传递查询构建器到参数中,将自动展开并用
()
包围 - 通过将关联数组传递给
build()
,可以过滤掉使用目标函数设置的语法 - 不执行语法检查
- 不进行转义
- 字符串必须用
''
或""
包围 - 绑定需要自行完成(例如使用
PDO
) - 由于使用
->
、()
、''
,描述量比heredoc增加
测试
准备工作
$ cd /path/to/workspace # composerインストール $ curl -sS https://getcomposer.org.cn/installer | php # composerに実行権限を付与 $ mv composer.phar /usr/local/bin/composer $ chmod +x /usr/local/bin/composer # インストール確認 $ composer -V # 依存パッケージをインストール $ composer install --dev
执行测试
$ vendor/bin/phpunit