链式查询
本文整理于网络,仅供阅读参考,如有不妥之处,敬请批评指正!如果您想加入微擎社区版技术大牛微信群和QQ群,请联系微信: ccccyyyy4444 或者 QQ:155120699
概述
链式查询类,提供面向对象方式查询数据,链式查询只支持一些常用简单的查询过于复杂的业务需求还是建议直接使用SQL语句。
查询用户表中的前十条普通用户数据,代码如下:
$query = load()->object('query');
$row = $query->from('users')->where('type', '1')->orderby('uid', 'desc')->limit(10)->getall();
上方代码中,from, where, orderby, limit 就是被称之为链示调用,除了一开始必须要先指定 from() 哪个表和最后需要获取数据时调用 **get() **, **getall() **时,其它函数书写并不区分先后顺序。
但是这里并不推荐直接实例化 Query 对象进行数据查询,对于程序员来说以下的代码和上面在“语义”上并没有什么太大的区别,链示查询只是简化和方便了SQL语句的书写。我们看代码都能知道他是在查询什么数据,但是并不知道这样做的意义和作用是什么。
pdo_fetchall("SELECT * FROM `users` WHERE type = '1' ORDER BY id DESC LIMIT 10");
所以我们更推荐将 Query 类结合 Table 类来一起使用,比如以上的查询可以改造为:
class UsersTable extends We7Table {
public function searchNewUserList() {
return $this->query->from('users')->getall();
}
public function searchWithType($type) {
$this->where('type', $type);
return $this;
}
public function searchCount($limit) {
$this->limit($limit);
return $this;
}
}
$usertable = new UsersTable();
$usertable->searchWithType(1);
$usertable->searchCount(10);
$list = $usertable->searchNewUserlist();
以上的代码,很明显的能明白查询者的意图,而且很灵活的进行修改,比如业务改变了要查询最新的20名普通用户,只需要
$usertable->searchCount(20);
即可。
在微擎中,所有的Query对象皆是以Table对象的形式存在,存放于 Framework/table 目录中,通过以下方式调用:
$users_table = table('users');
$users_table->searchWithFounder(ACCOUNT_MANAGE_GROUP_VICE_FOUNDER);
$users_table->searchWithPage($pindex, $psize);
$users = $users_table->getUsersList();
from()
说明
Query from($tablename, $alias = '')
指定要查询的表名
参数
- $tablename 参数指定要查询的数据表名,此处传入的表名不要使用
tablename()
函数 - $alias 表别名,方便以构造条件语句和关联时使用
示例
//如果指定别名,后续可以通过 别名.字段名 的形式来使用
$query = load()->object('query');
$row = $query->from('users', 'u')->select('u.username')->get();
select()
说明
Query select($field1, $field2, ...)
指定要查询的字段列表,相当于 SELECT * 、 SELECT name, username
参数
- $field 指定要查询的字段名,可以是多个参数也可以是一个数组
示例
$query = load()->object('query');
$row = $query->from('users', 'u')->select('uid', 'username')->get();
//也可以传入数组
$row = $query->from('users', 'u')->select(array('uid', 'username'))->get();
where()
说明
Query where(array | string $condition, $parameters = array())
指定查询条件,如果有多个条件可以连接多个where函数或是指定$condition为一个数组, 所有的查询条件将以 AND 连接
参数
- $condition 指定要查询的条件字段,也支持 范围条件操作,’>’, ‘<’, ‘<>’, ‘!=’, ‘>=’, ‘<=’, ‘+=’, ‘-=’, ‘LIKE’, ‘like’
- $parameters 指定查询条件的值
示例
//users表指定了别名,后续的字段如果需要可以写上别名前缀
$query = load()->object('query');
$row = $query->from('users', 'u')->where('u.type', '1')->where('uid >=', '2')->get();
//也可将条件写到一起
$row = $query->from('users', 'u')->where(array('u.type' => 1, 'uid >=' => 2))->get();
whereor()
说明
Query whereor(string | array $condition, $parameters = array())
与 where 一样使用,不同的是本函数是以 OR 来连接
示例
$query = load()->object('query');
$row = $query->from('users', 'u')->where('type', '1')->whereor('uid', 2)->get();
//生成SQL如下
SELECT * FROM users AS U WHERE type = '1' OR uid = '2' LIMIT 1
having()
说明
Query having(string | array $condition, $parameters = array())
指定要查询的条件,与 where 参数及使用方法一样,不同的 having 在聚合函数之后执行,一般要与groupby一起使用
示例
$query = load()->object('query');
$row = $query->from('users', 'u')->having('count(*) >', 2)->groupby('type')->getall();
groupby()
说明
Query groupby($field)
指定要分组的字段
参数
- $field 要分组查询的字段名
示例
$query = load()->object('query');
$row = $query->from('users', 'u')->groupby('u.type')->get();
orderby()
说明
Query orderby($field, $direction = 'ASC')
指定查询结果排序字段和方式
参数
- $field 要排序的字段名
- $direction 排序方式,可以为 ASC 或是 DESC
示例
$query = load()->object('query');
$row = $query->from('users', 'u')->orderby('u.uid', 'DESC')->get();
leftjoin()
说明
Query leftjoin($tablename, $alias = '')
指定要左关联的表,当需要rightjoin时,请调换一下顺序书写即可
参数
- $tablename 参数指定要查询的数据表名,此处传入的表名不要使用
tablename()
函数 - $alias 表别名,方便以构造条件语句和关联时使用
示例
$query = load()->object('query');
$row = $query->from('users', 'u')->leftjoin('users_profile', 'b')->on('u.uid', 'b.uid')->where('u.uid', '1')->get();
//如果关联条件有多个时,请使用数组形式
on(array('u.uid' => 'b.uid', 'u.username' => 'b.realname'))
innerjoin()
说明
Query innerjoin($tablename, $alias = '')
与 leftjoin 使用方法一样
on()
说明
Query on($condition, $parameters = array())
指定关联查询中的关联条件
参数
与 where 函数一样,多个关联条件可以使用数组形式,一个关联查询只可出现一个on语句
limit()
说明
Query limit(start, size)
指定要查询从第几行起的多少行,与SQL语句中的Limit意思一样
参数
- $start 查询从第几行起
- $size 查询多少行
示例
$query = load()->object('query');
$row = $query->from('users', 'u')->limit(1, 10)->getall();
page()
说明
Query page(pageindex, pagesize)
根据分页获取数据,转换成 limit 语句为 LIMIT (pageindex - 1) * pagesize, pagesize
参数
- $pageindex 当前页码
- $pagesize 一页多少条数据
示例
$query = load()->object('query');
$row = $query->from('users', 'u')->page(1, 10)->getall();
get()
说明
array get()
获取一条记录
示例
$query = load()->object('query');
$row = $query->from('users', 'u')->get();
getall()
说明
array getall($keyfield = '')
获取所有记录
参数
- $keyfield 获取记录集数组指定为键值的字段,默认是自然排序
示例
$query = load()->object('query');
$row = $query->from('users', 'u')->limit(1, 10)->getall('uid');
getcolumn()
说明
Mixed getcolumn($field = '')
获取一条记录中指定字段的值
参数
- $field 具体获取哪个字段的值
示例
$query = load()->object('query');
$row = $query->from('users', 'u')->getcolumn('username');
count()
说明
int count()
只获取结果集的数量有多少
示例
$query = load()->object('query');
$row = $query->from('users', 'u')->count();
exists()
说明
boolean exists()
获取满足某个条件的数据是否存在
示例
$query = load()->object('query');
$is_found = $query->from('users', 'u')->where('uid', 10)->exists();
getLastQueryTotal()
说明
int getLastQueryTotal()
当查询中使用了limit限制语句时,可以在完成查询后,调用此函数来获取整个表的数据量,一般用于分页使用
示例
$pindex = max(1, intval($_GPC['page']));
$psize = 20;
$query = load()->object('query');
$row = $query->from('users', 'u')->page($pindex, $psize)->getall();
$total = $query->getLastQueryTotal();
$pager = pagination($total, $pindex, $psize); //页码HTML
getLastQuery()
说明
array getLastQuery()
获取最后执行的SQL语句及参数,主要用于调试代码
示例
$query = load()->object('query');
$row = $query->from('users', 'u')->get();
print_r($query->getLastQuery());
如果看不懂微擎社区版二次开发手册或者遇到问题,请联系微信: ccccyyyy4444 或者 QQ:155120699 ,如果我们有空闲时间,可以免费为您答疑解惑。