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'] = 'thinkphp@qq.com';
$Model->data($data)->add();

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

$Model = M('User');
$obj = new \stdClass;
$obj->name = '流年';
$obj->email = 'thinkphp@qq.com';
$Model->data($obj)->add();

字符串方式用法如下:

$Model = M('User');
$data = 'name=流年&email=thinkphp@qq.com';
$Model->data($data)->add();

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

$Model = M('User');
$data['name'] = '流年';
$data['email'] = 'thinkphp@qq.com';
$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结果分页
havinghaving查询
groupgroup查询
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

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

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值