查询方式
tp提供了三种基本查询方式:字符串查询、索引数组条件查询和对象查询。多数情况下对提交使用索引数组查询和对象查询作为查询条件,因为会更加安全。
基于UserController.class.php
文件
字符串作为条件查询
<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller{
public function index($user,$pass){
echo 'user:'.$user,'<br/>pass:'.$pass;
}
public function model(){
$user = M('User');
//字符串作为查询条件
var_dump($user->where('id=1')->select());
}
}
使用索引数组作为查询条件
<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller{
public function index($user,$pass){
echo 'user:'.$user,'<br/>pass:'.$pass;
}
public function model(){
$user = M('User');
//使用索引数组作为查询条件
$condition['id'] = 1;
$condition['user'] = '小新';
//改变默认是‘AND’
$condition['_logic'] = 'OR';
var_dump($user->where($condition)->select());
}
}
使用对象方式作为查询条件
<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller{
public function index($user,$pass){
echo 'user:'.$user,'<br/>pass:'.$pass;
}
public function model(){
$user = M('User');
//使用对象作为查询条件
// \stdClass()是php5默认的空类
$condition = new \stdClass();
$condition->id = 1;
$condition->user = '小新';
//默认查询由AND变成OR
$condition->_logic = 'OR';
var_dump($user->where($condition)->select());
}
}
PS:stdClass是PHP内置的类,可以理解为一个空类。而这里的‘\’是将命名空间设置为根目录,否则会导致当前目录找不到此类。
PS:使用对象和数组查询效果是一样的,多数情况下,TP推荐使用数组形式更加高高效。
表达式查询
要实现模糊查询,可以使用表达式查询。
<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller{
public function index($user,$pass){
echo 'user:'.$user,'<br/>pass:'.$pass;
}
public function model(){
$user = M('User');
//$map[id] =array('eq',1); //等于
//$map[id] =array('neq',1); //不等于
//$map[id] =array('gt',1); //大于
//$map[user] = array('like','%小%'); //包含小字的字段
$map[user] = array('notlike','%小%'); //不包含小字的字段
var_dump($user->where($map)->select());
}
}
快捷查询
不同字段,相同查询条件
<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller{
public function index($user,$pass){
echo 'user:'.$user,'<br/>pass:'.$pass;
}
public function model(){
$user = M('User');
$map['user|email'] = '小新';
var_dump($user->where($map)->select());
}
}
返回结果为:user or email为小新的值。
当然,and的条件即:
<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller{
public function index($user,$pass){
echo 'user:'.$user,'<br/>pass:'.$pass;
}
public function model(){
$user = M('User');
$map['user&email'] = '小新';
var_dump($user->where($map)->select());
}
}
返回结果就是:user和email都为小新的值。
不同字段不同查询条件
<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller{
public function index($user,$pass){
echo 'user:'.$user,'<br/>pass:'.$pass;
}
public function model(){
$user = M('User');
//'_multi'=>true,设置查询条件一一对应
//也就是id为1,user为‘小新’
$map['id&user'] = array(1,'小新','_multi'=>true);
var_dump($user->where($map)->select());
}
}
PS:设置‘_multi’为true,是为了让id对应1,让user对应‘小新’,否则就会出现id对应了1还要对应‘小新’的情况,而且这设置要放在数组最后。
当然也可以和表达式进行组合
$user = M('User');
$map['id'] = array(array('gt',0),'小新','_multi'=>true);
var_dump($user->where($map)->select());
区间查询
<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller{
public function index($user,$pass){
echo 'user:'.$user,'<br/>pass:'.$pass;
}
public function model(){
$user = M('User');
//'_multi'=>true,设置查询条件一一对应
//也就是id为1,user为‘小新’
$map['id'] = array(array('gt',1),array('lt',4),'小新','OR');
var_dump($user->where($map)->select());
}
}
组合查询
组合查询基于索引数组方式的一个扩展性查询,添加了字符串查询(_string)、复合查询(_complex)、请求字符串查询(_query)。由于采用的是索引数组,重复的会被覆盖。
_string(字符串查询)
<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller{
public function index($user,$pass){
echo 'user:'.$user,'<br/>pass:'.$pass;
}
public function model(){
$user = M('User');
$map['id'] = array('eq',1);
$map['_string'] = 'user="小新"&email="xiaoxin@163.com"';
//$map['_logic'] = 'OR';
var_dump($user->where($map)->select());
}
}
_query(请求字符串查询)
<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller{
public function index($user,$pass){
echo 'user:'.$user,'<br/>pass:'.$pass;
}
public function model(){
$user = M('User');
$map['id'] = array('eq',1);
$map['_query'] = 'user=小新&email=xiaoxin@163.com';
var_dump($user->where($map)->select());
}
}
_complex(复合查询)
<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller{
public function index($user,$pass){
echo 'user:'.$user,'<br/>pass:'.$pass;
}
public function model(){
$user = M('User');
$map['id'] = array('eq',1);
$where['id'] = 2;
$map['_complex'] = $where;
$map['_logic'] = 'OR';
$map['_string'] = 'user="小新"&email="xiaoxin@163.com"';
var_dump($user->where($map)->select());
}
}
PS:复合查询可以构建很复杂的查询。
统计查询
数据总条数
<?php
namespace Home\Controller;
use Think\Controller;
class UserController extends Controller{
public function index($user,$pass){
echo 'user:'.$user,'<br/>pass:'.$pass;
}
public function model(){
$user = M('User');
var_dump($user->count());
}
}
字段总条数
$user = M('User'); var_dump($user->count('mail'));
最大值
$user = M('User'); var_dump($user->max('id'));
最小值
$user = M('User'); var_dump($user->min('id'));
平均值
$user = M('User'); var_dump($user->avg('id'));
求总和
$user = M('User'); var_dump($user->sum('id'));
动态查询
以PHP5新特性为主,TP实现了动态查询:
1、getBy动态查询
$user = M('User'); var_dump($user->getByMail('xiaoxin@163.com'));
2、getFieldBy动态查询
$user = M('User'); var_dump($user->getFieldByUser('路飞','id'));
SQL查询
TP支持原生SQL查询。
1、query读取
//如果采用分布式读写分离,则始终在读服务器执行 $user = M('User'); var_dump($user->query('SELECT $ FROM think_user'));
2、execute写入
//如果采用分布式读写分离,则始终在写服务器执行 $user = M('User'); var_dump($user->execute('UPDATE think_user SET user = "小新" where id = 1 '));