MYSQL 连贯操作

系统支持的连贯操作方法有:

连贯操作 作用 支持的参数类型
where* 用于查询或者更新条件的定义 字符串、数组和对象
table 用于定义要操作的数据表名称 字符串和数组
alias 用于给当前数据表定义别名 字符串
data 用于新增或者更新数据之前的数据对象赋值 数组和对象
field 用于定义要查询的字段(支持字段排除) 字符串和数组
order 用于对结果排序 字符串和数组
limit 用于限制查询结果数量 字符串和数字
page 用于查询分页(内部会转换成limit) 字符串和数字
group 用于对查询的group支持 字符串
having 用于对查询的having支持 字符串
join* 用于对查询的join支持 字符串和数组
union* 用于对查询的union支持 字符串、数组和对象
distinct 用于查询的distinct支持 布尔值
lock 用于数据库的锁机制 布尔值
cache 用于查询缓存 支持多个参数
relation 用于关联查询(需要关联模型支持) 字符串
result 用于返回数据转换 字符串
validate 用于数据自动验证 数组
auto 用于数据自动完成 数组
filter 用于数据过滤 字符串
scope* 用于命名范围 字符串、数组
bind* 用于数据绑定操作 数组或多个参数
token 用于令牌验证 布尔值
comment 用于SQL注释 字符串
index 用于数据集的强制索引(3.2.3新增) 字符串
strict 用于数据入库的严格检测(3.2.3新增) 布尔值

WHERE查询

字符串条件:

$User->where('type=1 AND status=1')->select();

数组条件:

$User = M("User"); // 实例化User对象
$map['name'] = 'thinkphp';
$map['status'] = 1;
// 把查询条件传入查询方法
$User->where($map)->select();

表达式条件:

$map['字段1']  = array('表达式','查询条件1');
$map['字段2']  = array('表达式','查询条件2');
$Model->where($map)->select(); 
表达式 含义
EQ 等于(=)
NEQ 不等于(<>)
GT 大于(>)
EGT 大于等于(>=)
LT 小于(<)
ELT 小于等于(<=)
LIKE 模糊查询
[NOT] BETWEEN (不在)区间查询
[NOT] IN (不在)IN 查询
EXP 表达式查询,支持SQL语法

多次调用

$map['a'] = array('gt',1);
$where['b'] = 1;
$Model->where($map)->where($where)->where('status=1')->select();

DATA(写入)

$Model = M('User');
$data['name'] = '流年';
$data['email'] = '[email protected]';
$Model->data($data)->add();

data方法支持数组、对象和字符串,对象方式如下:

$Model = M('User');
$obj = new \stdClass;
$obj->name = '流年';
$obj->email = '[email protected]';
$Model->data($obj)->add();

字符串方式用法如下:

$Model = M('User');
$data = 'name=流年&[email protected]';
$Model->data($data)->add();

也可以直接在add方法中传入数据对象来新增数据,例如:

$Model = M('User');
$data['name'] = '流年';
$data['email'] = '[email protected]';
$Model->add($data);

DATA(读取)

$User = M('User');
$map['name'] = '流年';
$User->where($map)->find();
// 读取当前数据对象
$data = $User->data(); 

FIELD

$Model->field('id,title,content')->select();

ORDER

$Model->where('status=1')->order('id desc')->limit(5)->select();

支持对多个字段的排序,例如:

$Model->where('status=1')->order('id desc,status')->limit(5)->select();

LIMIT

例如获取满足要求的10个用户,如下调用即可:

$User = M('User');
$User->where('status=1')->field('id,name')->limit(10)->select();

limit方法也可以用于写操作,例如更新满足要求的3条数据:

$User = M('User');
$User->where('score=100')->limit(3)->save(array('level'=>'A'));

分页查询

用于文章分页查询是limit方法比较常用的场合,例如:

$Article = M('Article');
$Article->limit('10,25')->select();

PAGE

$Article = M('Article');
$Article->page('1,10')->select(); // 查询第一页数据
$Article->page('2,10')->select(); // 查询第二页数据

GROUP

$this->field('user_id,username,max(score)')->group('user_id')->select();

也支持对多个字段进行分组,例如:

$this->field('user_id,test_time,username,max(score)')->group('user_id,test_time')->select();

HAVING

用于配合group方法完成从分组的结果中筛选(通常是聚合条件)数据。

$this->field('username,max(score)')->group('user_id')->having('count(test_time)>3')->select(); 

JOIN

  • INNER JOIN: 等同于 JOIN(默认的JOIN类型),如果表中有至少一个匹配,则返回行
  • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
  • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
  • FULL JOIN: 只要其中一个表中存在匹配,就返回行
$Model = M('Artist');
$Model
->join('think_work ON think_artist.id = think_work.artist_id')
->join('think_card ON think_artist.card_id = think_card.id')
->select();
$Model->join('__WORK__ ON __ARTIST__.id = __WORK__.artist_id','RIGHT')->select();

UNION

用于合并两个或多个 SELECT 语句的结果集。

$Model->field('name')
      ->table('think_user_0')
      ->union('SELECT name FROM think_user_1')
      ->union('SELECT name FROM think_user_2')
      ->select();

数组用法:

$Model->field('name')
      ->table('think_user_0')
      ->union(array('field'=>'name','table'=>'think_user_1'))
      ->union(array('field'=>'name','table'=>'think_user_2'))
      ->select();

支持UNION ALL 操作,例如:

$Model->field('name')
      ->table('think_user_0')
      ->union('SELECT name FROM think_user_1',true)
      ->union('SELECT name FROM think_user_2',true)
      ->select();

DISTINCT

去重

$Model->distinct(true)->field('name')->select();

fetchSql

用于直接返回SQL而不是执行查询,适用于任何的CURD操作方法。 例如:

$result = M('User')->fetchSql(true)->find(1);

输出result结果为: SELECT * FROM think_user where id = 1

TOKEN

用于临时关闭令牌验证,例如:

$model->token(false)->create();

STRICT

strict为3.2.3新增连贯操作,用于设置数据写入和查询是否严格检查是否存在字段。默认情况下不合法数据字段自动删除,如果设置了严格检查则会抛出异常。 例如:

$model->strict(true)->add($data);

命名范围(查询范围)

要使用命名范围功能,主要涉及到模型类的_scope属性定义和scope连贯操作方法的使用。

namespace Home\Model;
use Think\Model;
class NewsModel extends Model {
     protected $_scope = array(
         // 命名范围normal
         'normal'=>array(
             'where'=>array('status'=>1),
         ),
         // 命名范围latest
         'latest'=>array(
             'order'=>'create_time DESC',
             'limit'=>10,
         ),
     );
}

命名范围支持的属性包括:

属性 描述
where 查询条件
field 查询字段
order 结果排序
table 查询表名
limit 结果限制
page 结果分页
having having查询
group group查询
lock 查询锁定
distinct 唯一查询
cache 查询缓存

每个命名范围的定义可以包括这些属性中一个或者多个。

最简单的调用方式就直接调用某个命名范围,例如:

$Model = D('News'); // 这里必须使用D方法 因为命名范围在模型里面定义
$Model->scope('normal')->select();
$Model->scope('latest')->select();

生成的SQL语句分别是:

SELECT * FROM think_news WHERE status=1
SELECT * FROM think_news ORDER BY create_time DESC LIMIT 10

支持同时调用多个命名范围定义,例如:

$Model->scope('normal')->scope('latest')->select();

或者简化为:

$Model->scope('normal,latest')->select();
$Model->scope('normal')->limit(8)->order('id desc')->select();

这样,生成的SQL变成:

SELECT id,title FROM think_news WHERE status=1 ORDER BY id desc LIMIT 8

如果定义的命名范围和连贯操作的属性有冲突,则后面调用的会覆盖前面的。

猜你喜欢

转载自blog.csdn.net/qq_42176520/article/details/80849402