ThinkPHP中数据库CRUD操作方法盘点(limit、page、table、order、data方法)
limit方法
limit方法也是模型类的连贯操作方法之一,主要用于指定查询和操作的数量,特别在分页查询的时候使用较多。ThinkPHP的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();
表示查询文章数据,从第10行开始的25条数据(可能还取决于where条件和order排序的影响 这个暂且不提)。
在3.1版本后,你也可以这样使用:
$Article = M("Article");
$Article->limit(10,25)->select();
对于大数据表,尽量使用limit限制查询结果,否则会导致很大的内存开销和性能问题。
page方法
page方法也是模型的连贯操作方法之一,是完全为分页查询而诞生的一个人性化操作方法。
用法
我们在前面已经了解了关于limit方法用于分页查询的情况,而page方法则是更人性化的进行分页查询的方法,例如还是以文章列表分页为例来说,如果使用limit方法,我们要查询第一页和第二页(假设我们每页输出10条数据)写法如下:
$Article = M("Article");
$Article->limit("0,10")->select(); // 查询第一页数据
$Article->limit("10,10")->select(); // 查询第二页数据
虽然利用扩展类库中的分页类Page可以自动计算出每个分页的limit参数,但是如果要自己写就比较费力了,如果用page方法来写则简单多了,例如:
$Article = M("Article");
$Article->page("1,10")->select(); // 查询第一页数据
$Article->page("2,10")->select(); // 查询第二页数据
显而易见的是,使用page方法你不需要计算每个分页数据的起始位置,page方法内部会自动计算。
3.1版本以后,page方法也支持2个参数的写法,例如:
$Article->page(1,10)->select();
和
$Article->page("1,10")->select();
等效。
page方法还可以和limit方法配合使用,例如:
$Article->limit(25)->page(3)->select();
当page方法只有一个值传入的时候,表示第几页,而limit方法则用于设置每页显示的数量,也就是说上面的写法等同于:
$Article->page("3,25")->select();
table方法
table方法也属于模型类的连贯操作方法之一,主要用于指定操作的数据表。
用法
一般情况下,操作模型的时候系统能够自动识别当前对应的数据表,所以,使用table方法的情况通常是为了:
切换操作的数据表;
对多表进行操作;
例如:
$Model->table("think_user")->where("status>1")->select();
也可以在table方法中指定数据库,例如:
$Model->table("db_name.think_user")->where("status>1")->select();
需要注意的是table方法不会改变数据库的连接,所以你要确保当前连接的用户有权限操作相应的数据库和数据表。
切换数据表后,系统会自动重新获取切换后的数据表的字段缓存信息。
如果需要对多表进行操作,可以这样使用:
$Model->field("user.name,role.title")->table("think_user user,think_role role")->limit(10)->select();
为了尽量避免和mysql的关键字冲突,可以建议使用数组方式定义,例如:
$Model->field("user.name,role.title")->table(array("think_user"=>"user","think_role"=>"role"))->limit(10)->select();
order方法
order方法属于模型的连贯操作方法之一,用于对操作的结果排序。
用法
$Model->where("status=1")->order("id desc")->limit(5)->select();
注意:连贯操作方法没有顺序,可以在select方法调用之前随便改变调用顺序。
支持对多个字段的排序,例如:
$Model->where("status=1")->order("id desc,status")->limit(5)->select();
如果没有指定desc或者asc排序规则的话,默认为asc。
如果你的字段和mysql关键字有冲突,那么建议采用数组方式调用,例如:
$Model->where("status=1")->order(array("order","id"=>"desc"))->limit(5)->select();
data方法
data方法也是模型类的连贯操作方法之一,用于设置当前要操作的数据对象的值,可能大家不太习惯用这个方法,今天来讲解下如何用好data方法。
用法
写操作
通常情况下我们都是通过create方法或者赋值的方式生成数据对象,然后写入数据库,例如:
$Model = D("User");
$Model->create();
// 这里略过具体的自动生成和验证判断
$Model->add();
又或者直接对数据对象赋值,例如:
$Model = M("User");
$Model->name = "流年";
$Model->email = "thinkphp@qq.com";
$Model->add();
那么data方法则是直接生成要操作的数据对象,例如:
$Model = M("User");
$data["name"] = "流年";
$data["email"] = "thinkphp@qq.com";
$Model->data($data)->add();
注意:如果我们同时使用create方法和data创建数据对象的话,则后调用的方法有效。
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参数只能使用数组。
当然data方法也可以用于更新数据,例如:
$Model = M("User");
$data["id"] = 8;
$data["name"] = "流年";
$data["email"] = "thinkphp@qq.com";
$Model->data($data)->save();
当然我们也可以直接这样用:
$Model = M("User");
$data["id"] = 8;
$data["name"] = "流年";
$data["email"] = "thinkphp@qq.com";
$Model->save($data);
同样,此时data参数只能传入数组。
在调用save方法更新数据的时候 会自动判断当前的数据对象里面是否有主键值存在,如果有的话会自动作为更新条件。也就是说,下面的用法和上面等效:
$Model = M("User");
$data["name"] = "流年";
$data["email"] = "thinkphp@qq.com";
$Model->data($data)->where("id=8")->save();
读操作
除了写操作外,data方法还可以用于读取当前的数据对象,例如:
$User = M("User");
$map["name"] = "流年";
$User->where($map)->find();
// 读取当前数据对象
$data = $User->data();
本文章转自:ThinkPHP官方文档
- 上一篇: C++文件夹操作
- 下一篇: jQuery数据缓存方案详解:$.data()的使用