wp-forge / wp-query-builder
WordPress 的轻量级高效 SQL 查询构建器。
Requires
- php: >=5.4
README
WordPress 的轻量级高效 SQL 查询构建器。
这是原始项目 (https://github.com/sultann/wp-query-builder) 的分支,看起来没有维护。
安装
WP Query Builder 使用 PSR-4
自动加载,可以使用 composer 进行安装
$ composer require wp-forge/wp-query-builder
文档
初始化
init 方法接受一个字符串参数。您可以稍后使用它来使用针对您的查询构建器实例特定的动作/过滤器。
不带参数
$query = \WP_Forge\QueryBuilder\Query::init();
带参数
$query = \WP_Forge\QueryBuilder\Query::init('query_users');
Select
这将构建查询,执行并返回所有来自用户表的用户,自动应用表前缀。默认情况下,它选择所有(*),但您可以定义查询中要选择的内容;如果您正在选择所有内容,则可以省略选择语句。
$results = $query->select('*') ->from('users') ->get();
Select specific column
$results = $query->select('ID') ->from('users') ->get();
Select multiple column
$results = $query->select('user_login, user_email') ->from('users') ->get();
Where conditions
在接下来的几个示例中,让我们假设一个更大的数据集,以便查询更有意义。
$results = $query->select('*') ->from('users') ->where('user_email', 'like', '%gmail.com') ->get();
注意在第一个条件中省略操作符 ->where('user_url', ''),这使得它默认为 =。默认情况下,所有 where 条件都使用 and 操作符定义。
Different where operators
$results = $query->select('*') ->from('users') ->where('user_email', 'like', '%gmail.com') ->orWhere('user_email', 'like', '%yahoo.com') ->get();
还有更多的内置 Where 条件可用
andWhere()
whereIn()
whereNotIn()
whereNull()
whereNotNull()
orWhereNull()
orWhereNotNull()
whereBetween()
whereNotBetween()
whereDateBetween()
whereRaw()
Where scopes
允许您分组条件
$results = $query->select('*') ->from('posts') ->where('post_status', 'publish') ->where(function($q) { $q->where('menu_order', '>', 21); $q->where('menu_order', '<', 99); }) ->orWhere('post_type', 'page') ->get();
Where Between
$results = $query->select('*') ->from('posts') ->whereBetween('menu_order', 1, 20) ->get();
Where Not Between
$results = $query->select('*') ->from('posts') ->whereNotBetween('menu_order', 20, 30) ->get();
Where Date Between
$results = $query->select('*') ->from('posts') ->whereDateBetween('post_date', '2010-04-22 10:16:21', '2020-05-04') ->get();
Joins
默认情况下,所有连接都是 Left Join。可用的连接类型 'LEFT', 'RIGHT', 'INNER', 'CROSS', 'LEFT OUTER', 'RIGHT OUTER' 连接表
$results = $query->select( '*' ) ->from( 'posts p' ) ->join( 'users u', 'u.ID', '=','p.post_author' ) ->get();
Joins scopes
允许您分组条件
$results = $query->select( '*' ) ->from( 'posts p' ) ->join( 'users u', 'u.ID', '=','p.post_author' ) ->join('usermeta um', function($q) { $q->where('um.meta_key', 'first_name'); $q->where('um.met_value', 'like', '%sultan%'); }) ->get();
还有更多的内置连接条件可用
leftJoin()
rightJoin()
innerJoin()
outerJoin()
Grouping
分组数据
$results = $query->select('*') ->from('posts') ->group_by('post_status') ->get();
Having
按 having 数据分组
$results = $query->select('*') ->from('posts') ->group_by('post_status') ->having('count(ID)>1') ->get();
Ordering
排序数据
$results = $query->select('*') ->from('posts') ->order_by('post_title', 'DESC') ->get();
Limiting data
Limit and offset
$results = $query->select('*') ->from('posts') ->limit(20, 10) ->get();
Only limit
$results = $query->select('*') ->from('posts') ->limit(20) ->get();
Offset as separate
$results = $query->select('*') ->from('posts') ->limit(20) ->offset(10) ->get();
Pagination
limit 和 offset 的快捷方式
$results = $query->select('*') ->from('posts') ->page(1, 20)//page number & page size ->get();
Find
根据列值查找项
$results = $query->select('*') ->from('posts') ->find(1, 'ID');
First
从 posts 表中获取第一项
$results = $query->select('*') ->from('posts') ->first();
Last
从 posts 表中获取最后一项
$results = $query->select('*') ->from('posts') ->last();
Counting
计算总行数
$results = $query->select('*') ->from('posts') ->count();
toSql
输出查询而不是执行
$results = $query->from('posts as p') ->join('users as u', 'p.post_author', 'u.ID') ->join('usermeta um', function($q) { $q->where('um.meta_key', 'first_name'); $q->where('um.met_value', 'like', '%sultan%'); }) ->toSql();
Update
更新一行
$results = $query->table('posts') ->where('ID', 20) ->update(['post_title' => 'updated']);
Delete
删除一行
$results = $query->from('posts') ->where('ID', 20) ->delete();
Search
从列中搜索值
$results = $query->from('posts') ->search('Hello Word', array('post_title', 'post_content')) // it will search Hello & World both ->delete();