牛骨文教育服务平台(让学习变的简单)
博文笔记

ThinkPHP中数据库CRUD操作方法盘点(limit、page、table、order、data方法)

创建时间:2015-11-01 投稿人: 浏览次数:1601

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官方文档

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。