真XX项目 TP连贯操作总结
参考链接:CURD方法盘点:field方法
用于查询
在查询操作中field方法是使用最频繁的。
eg1:$Model ->field("id,title,content") ->select();
复制代码这里使用field方法指定了查询的结果集中包含id,title,content三个字段的值。执行的SQL相当于:
SELECT id,title,content FROM table可以as取别名
eg2: $Select ->field("id as role_id,role_name,role_type") ->select();
数组方式的定义可以为某些字段定义别名
eg:$Model ->field(array("id","title"=>"name","content")) ->select();
与while()和find()查询
M("User") ->where("id=".$userid) ->field("id as userid,user_role,follow,fans,love,head as photo,city,nickname,sex,age,message") ->find();
ps:while提供查询条件,find只查询一条即系统自动加上了 LIMIT 1 限制
find参考链接:ThinkPHP find方法 查询一条数据记录
表取别名 分页 查询
$Follow ->alias("c") //给表去别名。alias用于设置当前数据表的别名 便于使用其他的连贯操作例如join方法等。 ->join("__USER__ u ON c.c_bei= u.id") //JOIN方法是连贯操作中唯一可以多次调用的方法 ->where("c.c_zhu="{$userid}"") ->field("c.c_bei,u.id as accountid,u.sex,u.nickname,u.head as photo,u.message") ->limit($page,$number) //分页查询 ->select(); //返回一个二维数组的查询结果
table多表进行操作
$Model ->table("zca_blacklist bl,zca_user user") //多表查询并取别名 ->where("bl.user="{$userid}" AND bl.blacklister = user.id") ->field("user.id,user.nickname,user.head as photo,user.sex,user.message") ->limit($page,$number) ->select();
ps:CURD方法盘点:table方法
排序
$Photo ->field("url") ->where("album="{$albumid}"") ->order("add_time asc") ->find()["url"];
ps:order方法
用于写入
除了查询操作之外,field方法还有一个非常重要的安全功能–字段合法性检测(注意:该功能3.1版本开始才能支持)。field方法结合create方法使用就可以完成表单提交的字段合法性检测:
$Model ->field("title,email,content") ->create(); //表单中的合法字段只有title,email和content字段 无论用户通过什么手段更改或者添加了浏览器的提交字段 都会直接屏蔽
ps:create方法
参考链接:CURD方法盘点:where方法
字符串条件
使用字符串条件直接查询和操作
$User ->where("type=1 AND status=1") ->select();
最后生成的SQL语句是:SELECT * FROM think_user WHERE type=1 AND status=1
如果使用3.1以上版本的话,使用字符串条件的时候,建议配合预处理机制,确保更加安全
$Model ->where("id=%d and username="%s" andxx="%f"",array($id,$username,$xx)) ->select();
或者使用:
$Model ->where("id=%d and username="%s" and xx="%f"",$id,$username,$xx) ->select();
ps:如果$id变量来自用户提交或者URL地址的话,如果传入的是非数字类型,则会强制格式化为数字格式后进行查询操作。
字符串预处理格式类型支持指定数字、字符串等,具体可以参考vsprintf方法的参数说明。参考链接:PHP vsprintf() 函数
数组条件
普通查询
$User = M("User"); // 实例化User对象 $map["name"] = "thinkphp"; $map["status"] = 1; // 把查询条件传入查询方法 $User->where($map)->select();
最后生成:SELECT * FROM think_user WHERE
name
=’thinkphp’ AND status=1表达式查询
$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语法
示例如下:
EQ :等于(=)
$map["id"] = array("eq",100);
和下面的查询等效
$map["id"] = 100;
表示的查询条件就是 id = 100
NEQ: 不等于(<>)
$map["id"] = array("neq",100);
表示的查询条件就是 id <> 100
GT:大于(>)
$map["id"] = array("gt",100);
表示的查询条件就是 id > 100
EGT:大于等于(>=)
$map["id"] = array("egt",100);
表示的查询条件就是 id >= 100
LT:小于(<)
$map["id"] = array("lt",100);
表示的查询条件就是 id < 100
ELT: 小于等于(<=)
$map["id"] = array("elt",100);
表示的查询条件就是 id <= 100
[NOT] LIKE: 同sql的LIKE
$map["name"] = array("like","thinkphp%");
查询条件就变成 name like ‘thinkphp%’
如果配置了DB_LIKE_FIELDS参数的话,某些字段也会自动进行模糊查询。
例如设置了:"DB_LIKE_FIELDS"=>"title|content"
的话,使用
$map["title"] = "thinkphp";
查询条件就会变成 name like ‘%thinkphp%’
支持数组方式,例如
$map["a"] =array("like",array("%thinkphp%","%tp"),"OR"); $map["b"] =array("notlike",array("%thinkphp%","%tp"),"AND"); 生成的查询条件就是: (a like "%thinkphp%" OR a like "%tp") AND (b not like "%thinkphp%" AND b not like "%tp")
[NOT] BETWEEN :同sql的[not] between, 查询条件支持字符串或者数组
例如:
$map["id"] = array("between","1,8");
和下面的等效:
$map["id"] = array("between",array("1","8"));
查询条件就变成 id BETWEEN 1 AND 8
[NOT] IN: 同sql的[not] in ,查询条件支持字符串或者数组
例如:$map["id"] = array("not in","1,5,8");
和下面的等效:
$map["id"] = array("not in",array("1","5","8"));
查询条件就变成 id NOT IN (1,5, 8)
EXP:表达式,支持更复杂的查询情况
例如:$map["id"] = array("in","1,3,8");
可以改成:
$map["id"] = array("exp"," IN (1,3,8) ");
exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。
查询表达式不仅可用于查询条件,也可以用于数据更新
例如:
$User = M("User"); // 实例化User对象 // 要修改的数据对象属性赋值 $data["name"] = "ThinkPHP"; $data["score"] = array("exp","score+1"); // 用户的积分加1 $User ->where("id=5") ->save($data); // 根据条件保存修改的数据
快捷查询
$User = M("User"); // 实例化User对象
$map["name|title"] = "thinkphp";
// 把查询条件传入查询方法
$User
->where($map)
->select();
查询条件就变成
name= "thinkphp" OR title = "thinkphp
// 把查询条件传入查询方法
->select();
‘_multi’=>true必须加在数组的最后,表示当前是多条件匹配,这样查询条件就变成 status= 1 AND title = ‘thinkphp’ ,查询字段支持更多的,
例如:
$map["status&score&title"] =array("1",array("gt","0"),"thinkphp","_multi"=>true);
查询条件就变成
status= 1 AND score >0 AND title = "thinkphp"
注意:快捷查询方式中“|”和“&”不能同时使用。
区间查询
where方法支持对某个字段的区间查询,
例如:
AND
$map["id"] = array(array("gt",1),array("lt",10)) ;
得到的查询条件是:
(`id` > 1) AND (`id` < 10)
OR
$map["id"] = array(array("gt",3),array("lt",10), "or") ;
得到的查询条件是:
(`id` > 3) OR (`id` < 10)
AND
$map["id"] = array(array("neq",6),array("gt",3),"and");
得到的查询条件是:
(`id` != 6) AND (`id` > 3)
最后一个可以是AND、 OR或者 XOR运算符,如果不写,默认是AND运算。
区间查询的条件可以支持普通查询的所有表达式,也就是说类似LIKE、GT和EXP这样的表达式都可以支持。另外区间查询还可以支持更多的条件,只要是针对一个字段的条件都可以写到一起
例如:
$map["name"] =
array(array("like","%a%"),
array("like","%b%"),
array("like","%c%"),
"ThinkPHP","or");
最后的查询条件是:
(`name` LIKE "%a%") OR (`name` LIKE "%b%") OR (`name` LIKE "%c%") OR (`name` = "ThinkPHP")
组合查询
组合查询的主体还是采用数组方式查询,只是加入了一些特殊的查询支持,包括字符串模式查询(_string)、复合查询(_complex)、请求字符串查询(_query),混合查询中的特殊查询每次查询只能定义一个,由于采用数组的索引方式,索引相同的特殊查询会被覆盖。
字符串模式查询
_string
数组条件还可以和字符串条件混合使用
例如:
$User = M("User"); // 实例化User对象 $map["id"] = array("neq",1); $map["name"] = "ok"; $map["_string"] = "status=1 AND score>10"; $User->where($map)->select();
最后得到的查询条件就成了:
( `id` != 1 ) AND ( `name` = "ok" ) AND ( status=1 AND score>10 )
请求字符串查询方式
_query
请求字符串查询是一种类似于URL传参的方式,可以支持简单的条件相等判断。
$map["id"] = array("gt","100"); $map["_query"] = "status=1&score=100&_logic=or";
得到的查询条件是:
`id`>100 AND (`status` = "1" OR `score` = "100")
复合查询
复合查询相当于封装了一个新的查询条件,然后并入原来的查询条件之中,所以可以完成比较复杂的查询条件组装。
_complex
例如:$where["name"] = array("like", "%thinkphp%"); $where["title"] = array("like","%thinkphp%"); $where["_logic"] = "or"; $map["_complex"] = $where; $map["id"] = array("gt",1);
查询条件是
( id > 1) AND ( ( name like "%thinkphp%") OR ( title like "%thinkphp%") )
复合查询使用了_complex作为子查询条件来定义,配合之前的查询方式,可以非常灵活的制定更加复杂的查询条件。
很多查询方式可以相互转换,例如上面的查询条件可以改成:
$where["id"] = array("gt",1); $where["_string"] = " (name like "%thinkphp%") OR ( title like "%thinkphp") ";
最后生成的SQL语句是一致的。
多次调用
3.1.3版本开始,where方法支持多次调用,但字符串条件只能出现一次
例如:
$map["a"] = array("gt",1); $where["b"] = 1; $Model ->where($map) ->where($where) ->where("status=1") ->select();
多次的数组条件表达式会最终合并,但字符串条件则只支持一次。
where()补充
与count()统计
M("User") ->where("phone=".$phone) ->count();
- count():统计数据行数
- max():统计某个字段最大数据
- min():统计某个字段最小数据
- avg():统计某个字段平均数据
- sum():统计某个字段数据之和
参考资料:统计查询
与find()只查询一条
$User ->where("phone=".$data["phone"]) ->find();
与setInc()字段跟新
if($User->add($data)){ M("Role") ->where("role_type") ->setInc("role_num"); }
ps:
必须配合连贯操作where一起使用$User = M("User"); // 实例化User对象 $User->where("id=5")->setInc("score",3); // 用户的积分加3 $User->where("id=5")->setInc("score"); // 用户的积分加1 $User->where("id=5")->setDec("score",5); // 用户的积分减5 $User->where("id=5")->setDec("score"); // 用户的积分减1
3.0的这setInc、setDec方法有了新的升级,在增加会员积分,和登录次数的时候,非常中用。
参考链接:thinkphp3.0增加setInc、setDec方法
与seve()更新数据
where("id="{$userid}"") ->save($data);
注意:使用 save() 方法更新数据,必须指定更新条件或者更新的数据中包含主键字段。
参考资料ThinkPHP 更新数据 save方法
与setField()更新个别字段的值
$User ->where("id="{$userid}"") ->setField("online","0");
参考资料:setField 方法更新个别字段的值
与find()以及field()指定查询字段
$store ->where("userid=".$userid) ->field("id,certification") ->find();
多表查询
join
$Follow
->alias(‘c’)
->join(‘USER u ON c.c_bei= u.id’)
->where(“c.c_zhu=’{userid}’”)
->field(‘c.c_bei,u.id as accountid,u.sex,u.nickname,u.head as photo,u.message’)
->limit(page,$number)
->select();table
Model
->table(‘zca_user user,zca_ol ol’)
->where(“ol.ol_num = {live_id} AND ol.ol_man = user.id AND ol.status = ‘1’”)
->count();
1、原生查询示例:
$Model = new Model(); $sql = "select a.id,a.title,b.content from think_test1 as a, think_test2 as b where a.id=b.id ".$map." order by a.id ".$sort." limit ".$p->firstRow.",".$p->listRows; $voList = $Model->query($sql);
2、join()方法示例:
$Model ->join("work ON artist.id = work.artist_id") ->join("card ON artist.card_id = card.id") ->select();
3、table()方法示例:
$list = $user ->table("user_status stats, user_profile profile") ->where("stats.id = profile.typeid") ->field("stats.id as id, stats.display as display, profile.title as title,profile.content as content") ->order("stats.id desc" )->select();
参考资料:ThinkPHP的多表查询
用AND直接写入条件
M("System") ->where("`userid`={$userid} AND `acceptid`={$user_author["prd_author"]} AND `worksid` = {$got} AND `type`= "1"") ->count();
删除
$Praise ->where($map) ->delete();
排序
$Photo ->field("url") ->where("album="{$albumid}"") ->order("add_time asc") ->find()["url"];
2017/1/14 22:43:24
在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、学生的平均成绩等等,ThinkPHP 为这些统计操作提供了一系列的内置方法:
count():统计数据行数
max():统计某个字段最大数据
min():统计某个字段最小数据
avg():统计某个字段平均数据
sum():统计某个字段数据之和
上述统计查询方法都是独立的方法且支持连贯操作。
count()
count() 方法用于统计数据行数。
例子:
public function read(){ $Dao = M("User"); // 获取用户数: $userCount = $Dao ->count(); //SELECT COUNT(*) AS tp_count FROM user LIMIT 1 // 添加条件: $userCount2 = $Dao ->where("uid > 10") ->count(); //SELECT COUNT(*) AS tp_count FROM user WHERE uid > 10 LIMIT 1 $Model ->table("pre_user user,pre_ol ol") ->where("ol.ol_num = {$live_id} AND ol.ol_man = user.id AND ol.status = "1"") ->count(); $this->assign("userCount", $userCount); // 可以在模板中直接输出得到的统计数据: // 共有用户 {$userCount} 人。 $this->display(); }
max()
max() 方法用于统计某个字段最大数据。
统计用户最大积分例子:
$maxScore = $Dao->max("score");
实际执行的 SQL 为:
SELECT MAX(score) AS tp_max FROM user LIMIT 1
min()
min() 统计某个字段最小数据。
获取积分大于 0 的用户的最小积分例子:
$minScore = $Dao->where("score>0")->min("score");
实际执行的 SQL 为:
SELECT MIN(score) AS tp_min FROM user WHERE score>0 LIMIT 1
avg()
avg() 统计某个字段平均数据。
获取用户的平均积分例子:
$avgScore = $Dao->avg("score");
实际执行的 SQL 为:
SELECT AVG(score) AS tp_avg FROM user LIMIT 1
sum()
sum() 统计某个字段数据之和。
统计积分排名前 10 名用户的积分之和:
$sumScore = $Dao->order("score DESC")->limit("10")->sum("score");
实际执行的 SQL 为:
SELECT SUM(score) AS tp_sum FROM user ORDER BY score DESC LIMIT 10
所有的统计查询如 select() 方法一样。均支持连贯操作的使用,根据实际情况添加不同的查询条件。
使用add方法新增数据到数据库。
$User = M("User"); // 实例化User对象 $data["name"] = "username"; $data["email"] = "username@gmail.com"; $User->add($data);
或者使用data方法连贯操作
$User->data($data)->add();
字符串方式
字符串方式用法如下:
$Model = M("User"); $data = "name=zy2333&email=zy2333@qq.com"; $Model->data($data)->add();
参考资料:data方法
add()和addAll()的区别
add()是记录单条插入
$User = M("User"); // 实例化User对象 $data["name"] = "ThinkPHP"; $data["email"] = "ThinkPHP@gmail.com"; $User->add($data);
addAll()是记录批量插入
$dataList[] = array("name"=>"thinkphp","email"=>"thinkphp@gamil.com"); $dataList[] = array("name"=>"onethink","email"=>"onethink@gamil.com"); $User->addAll($dataList);
注意:下标为0,否则可能失败
mysql:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
数据量很多情况下尽量选择批量插入而不是循环逐条插入,否则你的数据库会吃不住挂掉。
不过如果你想当然的将所有数据全部存入一个数组并进行addAll也同样会面临挂掉的情况,这是为什么呢?
原因就是mysql中max_allowed_packet变量的配置限制了上传sql语句的长度,在mysql配置中将他配置大一点就行了max_allowed_packet = 100M
同时在插入数据时也做好批量插入的长度限制,毕竟你不知道什么时候数据会变成百万级别的。
-addAll实例
//上传相册图片 (多) public function prd_photo() { $upload = new ThinkUpload();// 实例化上传类 $upload->maxSize = 3145728 ;// 设置附件上传大小 $upload->exts = array("jpg", "gif", "png", "jpeg");// 设置附件上传类型 $upload->savePath = "./Public/Uploads/"; // 设置附件上传目录// 上传文件 $info = $upload->upload(); if(!$upload->rootPath){ mkdir($upload->rootPath,0777,true); } if(!$info) { $rest["status"] = false; $rest["message"] = "上传失败"; $rest["error"] = $this->error($upload->getError()); echo json_encode($rest,JSON_UNESCAPED_UNICODE);exit; }else{ $dataList = []; foreach($info as $file){ $dataList[] = [ "author" => $_REQUEST["userid"], "album" => $_REQUEST["album"], "url" => "/Uploads/photo/".$file["savepath"].$file["savename"], "add_time" => time(), ]; } $Photo=M("Photo"); $Arr = $Photo->addAll($dataList); if($Arr){ $rest["status"] = true; $rest["message"] = "上传成功"; echo json_encode($rest,JSON_UNESCAPED_UNICODE);exit; } } }
addAll方法中不能出现null值,否则其他数据会自动向前移动,导致添加失败。举例:
[ { "appId": 1, "serviceId": 2, "createUser":null, "status": 1, "priority": 2 } ]
其中,createUser字段为null,插入时的sql语句会变成insert into va_problem (appId, serviceId, createUser, status, priority)values (1, 2, 1, 2)。null值没了,导致插入失败,这应该是ThinkPHP3.2.3的一个bug。
参考资料小心使用ThinkPHP中的addAll方法,关于addAll()失败的问题
使用 save() 方法来更新数据库
$User->where("id="{$userid}"")->save($data);
提示:
为了保证数据库的安全,避免出错更新整个数据表,如果没有任何更新条件,数据对象本身也不包含主键字段的话,save方法不会更新任何数据库的记录。
因此要使用 save() 方法更新数据,必须指定更新条件或者更新的数据中包含主键字段。
如果是表单数据,还可以使用 create() 方法创建数据对象来更新数据:
public function update(){ header("Content-Type:text/html; charset=utf-8"); $Dao = D("User"); if($vo = $Dao->create()) { $result = $Dao->save(); if($result !== false){ echo "数据更新成功!"; }else{ echo "数据更新失败!"; } }else{ $this->error($Form->getError()); } }
参考资料:create()方法
create() 创建数据对象后,将自动收集提交过来的表单数据。而表单数据可能需要经过一定加工(例如将密码加密)才能写入数据表,所以可以对数据对象的成员属性值根据进行修改或添加去除等。
提示:
create() 创建的数据对象存放于内存,在执行入库动作(add() 或 save())之前,都可以进行修改。
在上面的例子里,create()方法 的行为和 date()方法 是一致。但 date() 方法只是简单的创建数据对象,但 create() 方法还具备:步骤 说明 返回 1 获取数据源(默认是POST数组) 2 验证数据源合法性(非数组或者对象会过滤) 失败则返回false 3 检查字段映射 4 判断提交状态(新增或者编辑 根据主键自动判断) 5 数据自动验证 失败则返回false 6 表单令牌验证 失败则返回false 7 表单数据赋值(过滤非法字段和字符串处理) 8 数据自动完成 9 生成数据对象(保存在内存) 在执行入库动作(add() 或 save())之前,进行修改
User=M(‘User′); User->create(); //创建User数据对象
User−>status=1;//设置默认的用户状态 User->create_time = time(); // 设置用户的创建时间
$User->add(); // 把用户对象写入数据库自动验证与自动填充
在将表单写入数据表之前,常常会有一些对数据的检测(提交的用户名是否符合要求)与处理(如例子中的密码加密以及取得当前时间戳)。create() 方法就支持数据的自动验证与自动完成。
在 LibModel 目录下创建 UserModel.class.php 文件(User 为创建的模型对象,也对应 前缀_user 表),加入自动验证和自动填充规则:
class UserModel extends Model{ // 自动验证设置 protected $_validate = array( array("username","require","用户名必须填写!",1), array("email","email","邮箱格式错误!",2), array("username","","用户名已经存在!",0,"unique",1), ); //自动填充设置 protected $_auto = array( array("regdate","time",self::MODEL_INSERT,"function"), array("password","md5",self::MODEL_INSERT,"function"), ); }
将 insert2 操作更改为:
public function insert2(){ header("Content-Type:text/html; charset=utf-8"); $Dao = D("User"); if($Dao->create()){ if($lastInsId = $Dao->add()){ echo "插入数据 id 为:$lastInsId"; } else { echo "数据写入错误!"; } }else{ exit($Dao->getError()." [ <a href="javascript:history.back()">返 回</a> ]"); } }
如果提交的数据不符合验证要求(如用户名存在),则 create() 创建数据对象失败(返回 FALSE ),$Dao->getError() 会打印出自动验证设置规则里面设置的提示信息:用户名已经存在!
如果验证规则通过后,系统会进行自动填充设置,将表单密码进行 MD5 加密以及取得当前的时间戳填充入 create() 的数据对象。
所以 D方法 配合 create() 是非常智能而强大的,恰当运用可以达到事半功倍快速开发的目的。提示
D 方法配合 create() 由于其功能强大,也就损失了一定的效率,在业务逻辑不复杂的情况下推荐 M方法+data() 模式
create() 默认接受 POST 数据,若要接受其他类型数据,只需在参数内指定即可,如接受 GET 数据:create($_GET)create方法如果没有传值,默认取$_POST数据,如果用户提交的变量内容,含有可执行的html代码,请进行手工过滤。
$_POST["title"] = "<script>alert(1);</script>";
非法html代码可以使用htmlspecialchars进行编码,以防止用户提交的html代码在展示时被执行,以下是两种安全处理方法。
$_POST["title"] = htmlspecialchars($_POST["title"]); M("User")->create(); $data["title"] = $this->_post("title", "htmlspecialchars"); M("User")->create($data);
参考资料:create()方法创建数据,表单数据智能写入 create 方法,ThinkPHP3.1快速入门(16)安全
写操作
通常情况下我们都是通过create方法或者赋值的方式生成数据对象,然后写入数据库,例如:
$Model = D("User"); $Model->create(); // 这里略过具体的自动生成和验证判断 $Model->add();
又或者直接对数据对象赋值,例如:
$Model = M("User"); $Model->name = "zy"; $Model->email = "zy2333@qq.com"; $Model->add();
那么data方法则是直接生成要操作的数据对象,例如:
$Model = M("User"); $data["name"] = "zy"; $data["email"] = "zy2333@qq.com"; $Model->data($data)->add();
注意:如果我们同时使用create方法和data创建数据对象的话,则后调用的方法有效。
data方法支持数组、对象和字符串,对象方式如下:
$Model = M("User"); $obj = new stdClass; $obj->name = "zy"; $obj->email = "zy2333@qq.com"; $Model->data($obj)->add();
字符串方式用法如下:
$Model = M("User"); $data = "name=zy&email=zy2333@qq.com"; $Model->data($data)->add();
也可以直接在add方法中传入数据对象来新增数据,例如:
$Model = M("User"); $data["name"] = "zy"; $data["email"] = "zy2333@qq.com"; $Model->add($data);
但是这种方式data参数只能使用数组。
当然data方法也可以用于更新数据,例如:
$Model = M("User"); $data["id"] = 8; $data["name"] = "zy"; $data["email"] = "zy2333@qq.com"; $Model->data($data)->save();
当然我们也可以直接这样用:
$Model = M("User"); $data["id"] = 8; $data["name"] = "zy"; $data["email"] = "zy2333@qq.com"; $Model->save($data);
同样,此时data参数只能传入数组。
在调用save方法更新数据的时候 会自动判断当前的数据对象里面是否有主键值存在,如果有的话会 自动作为更新条件。也就是说,下面的用法和上面等效:
$Model = M("User"); $data["name"] = "zy"; $data["email"] = "zy2333@qq.com"; $Model->data($data)->where("id=8")->save();
读操作
除了写操作外,data方法还可以用于读取当前的数据对象,例如:
$User = M("User"); $map["name"] = "zy"; $User->where($map)->find(); // 读取当前数据对象 $data = $User->data();
2017/1/15 21:28:15
find() 方法是和 select() 用法类似的一个方法,不同之处 find() 查询出来的始终只有一条数据,即系统自动加上了 LIMIT 1 限制。
当确认查询的数据记录只能是一条记录时,建议使用 find() 方法查询,如用户登录账号检测:
public function chekUser(){ header("Content-Type:text/html; charset=utf-8"); $Dao = M("User"); // 构造查询条件 $condition["username"] = "Admin"; $condition["password"] = MD5("123456"); // 查询数据 $list = $Dao->where($condition)->find(); if($list){ echo "账号正确"; }else{ echo "账号/密码错误"; } }
与 select() 的另一个不同之处在于,find() 返回的是一个一维数组,可以在模板里直接输出数组单元的值而无需使用 volist 等标签循环输出:
{$list["username"]}
find() 主键查询
当 find() 查询的条件参数为表主键时,可以直接将参数写入方法内,如:
$Dao = M("User"); $list = $Dao->find(1);
user 表主键为 uid,该例子将查询 uid=1 的数据,这是 ActiveRecords 模式实现之一,简洁直观。
setField() 方法用于更新个别字段的值。
例子:
public function update(){ header("Content-Type:text/html; charset=utf-8"); $Dao = M("User"); $result = $Dao->where("uid = 2")->setField("email","zy2333@163.com"); if($result !== false){ echo "数据更新成功!"; }else{ echo "没更新任何数据!"; } }
上面例子执行的 SQL 语句为:
UPDATE user SET email="zy2333@163.com" WHERE uid = 2
更新多个字段
setField() 方法支持同时更新多个字段,只需要传入数组参数即可:
public function update(){ header("Content-Type:text/html; charset=utf-8"); $Dao = M("User"); $result = $Dao->where("uid = 28")->setField(array("username","email"),array("zy2333","zy2333@163.com")); if($result !== false){ echo "数据更新成功!"; }else{ echo "没更新任何数据!"; } }
setField() 方法的语法为:
setField(fields, value, condition="")
因此 setField() 不可以像 save() 方法一样,以构造数据数组的方式传入 setField(),而需要将需要更新的字段与值分别传入 setField() 方法中。
- 上一篇: tp5 session_id 跨域
- 下一篇: php 简单的表单接收