ThinkPHP的组合查询

如果你需要在查询的时候同时偶尔使用字符串却又不希望丢失数组方式的灵活的话,可以考虑使用组合查询。
组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string)、复合查询(_complex)、请求字符串 查询(_query),混合查询中的特殊查询每次查询只能定义一个,由于采用数组的索引方式,索引相同的特殊查询会被覆盖。

一. 字符串模式查询(采用_string 作为查询条件)

数组条件还可以和字符串条件混合使用,例如:

$User = M("member"); 
$map['id'] = array('neq',5);
$map['name'] = 'wzt';
$map['_string'] = 'status=1 AND score>10';
$User->where($map)->select();

最后得到的查询条件:

( `id` != 5 ) AND ( `name` = 'wzt' ) AND ( status=1 AND score>10 )

二. 请求字符串查询方式

请求字符串查询是一种类似于URL传参的方式,可以支持简单的条件判断

$map['m_id'] = array('gt','10');
$map['_query'] = 'status=1&score>60&_logic=or';

得到的查询条件是:

`m_id`>10 AND (`status` = '1' OR `score` > '60')

三. 复合查询

复合查询相当于封装了一个新的查询条件,然后并入原来的查询条件之中,所以可以完成比较复杂的查询条件组装。

例如:
``
$where[‘name’] = array(‘like’, ‘%kw%’);
$where[‘title’] = array(‘like’,’%kw%’);
$where[‘_logic’] = ‘or’;
$con[‘_complex’] = $where;
$con[‘id’] = array(‘gt’,5);


查询条件是

( id > 5) AND ( ( name like ‘%kw%’) OR ( title like ‘%kw%’) )

复合查询使用了_complex作为子查询条件来定义,配合之前的查询方式,可以非常灵活的制定更加复杂的查询条件。

很多查询方式可以相互转换,例如上面的可以改成

$where[‘id’] = array(‘gt’,5);
$where[‘_string’] = ‘ (name like “%kw%”) OR ( title like “%kw%”) ‘;


最后生成的SQL语句是一致的。

ThinkPHP的组合查询
https://github.13sai.com/2016/06/02/47/
作者
13sai
许可协议