Thinkphp6(6)模型学习与知识总结(二)
上一次学习了模型,对模型有一点小认识,今天再来学习一下,我一开始是没有想到要学习模型,原因是CURD(增删改查)中很多可以用Db类在控制器中完成,其实模型有很多好东西的,今天就来学习一下,今天从0开始来,所有的代码都是放在此,以后可用到。
本次学习想学习的内容
1.增删改查--静态方法create
2.增删改查--自动消除多余的字段的方法allowfield和save
3.软删除
4.自动时间戳
下面先做一些准备
一、建立一个数据库
CREATE TABLE mytp_users (
id int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
user_name varchar(255) DEFAULT NULL COMMENT '姓名',
user_idcard varchar(18) DEFAULT NULL COMMENT '身份证号',
user_password varchar(32) DEFAULT NULL COMMENT '密码',
user_school varchar(32) DEFAULT NULL COMMENT '学校',
user_mobile varchar(11) DEFAULT NULL COMMENT '手机号',
user_email varchar(255) DEFAULT NULL COMMENT '电子邮件',
user_qq varchar(20) DEFAULT NULL COMMENT 'QQ号',
user_status int(2) DEFAULT NULL COMMENT '状态',
create_time int(10) DEFAULT NULL COMMENT '创建时间',
update_time int(10) DEFAULT NULL COMMENT '更新时间',
delete_time int(10) DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
二、再建立一个模型
<?php
namespace appmodel;
use thinkModel;
use thinkmodelconcernSoftDelete;
//use thinkfacadeDb;
/**
*
*/
class Users extends Model
{
protected $name = 'Users';
protected $table = 'mytp_Users';
//开了软删除功能
use SoftDelete;
protected $deleteTime = 'delete_time';
//开启自动时间戳
protected $autoWritetamp=true;
/* public function create($data)
{
$create=Users::create($data);
return $create;
}*/
}
三、在控制器中建立一个控制器Userstest.php
<?php
namespace appcontroller;
use appBaseController;
use thinkfacadeDb;
use appmodelUsers;
class Userstest extends BaseController
{
private $name=['杨过','小龙女','孙婆婆','李莫愁','林玉','公孙止','裘千尺','公孙绿萼','武三娘','武敦儒','武修文','郭芙','郭襄','郭破虏','耶律齐','耶律燕','完颜萍','何师我','陆展元','何沅君','陆无双','陆立鼎','陆二娘','程英','忽必烈','金轮法王','霍都','达尔巴','藏边五丑','潇湘子','尹克西','尼摩星','马光佐','百草仙','人厨子','圣因师太','张一氓','西山一窟鬼','史伯威','史仲猛','史叔刚','史季强','史孟捷'];
private $email=['YG@qq.com','XLN@qq.com','SPP@qq.com','LMC@qq.com','LY@qq.com','GSZ@qq.com','QQC@qq.com','GSLE@qq.com','WSN@qq.com','WDR@qq.com','WXW@qq.com','GF@qq.com','GX@qq.com','GPL@qq.com','YLQ@qq.com','YLY@qq.com','WYP@qq.com','HSW@qq.com','LZY@qq.com','HYJ@qq.com','LWS@qq.com','LLD@qq.com','LEN@qq.com','CY@qq.com','HBL@qq.com','JLFW@qq.com','HD@qq.com','DEB@qq.com','CBWC@qq.com','XXZ@qq.com','YKX@qq.com','NMX@qq.com','MGZ@qq.com','BCX@qq.com','RCZ@qq.com','SYST@qq.com','ZYM@qq.com','XSYKG@qq.com','SBW@qq.com','SZM@qq.com','SSG@qq.com','SJQ@qq.com','SMJ@qq.com'];
private $mobile=['18988880001','18988880002','18988880003','18988880004','18988880005','18988880006','18988880007','18988880008','18988880009','18988880010','18988880011','18988880012','18988880013','18988880014','18988880015','18988880016','18988880017','18988880018','18988880019','18988880020','18988880021','18988880022','18988880023','18988880024','18988880025','18988880026','18988880027','18988880028','18988880029','18988880030','18988880031','18988880032','18988880033','18988880034','18988880035','18988880036','18988880037','18988880038','18988880039','18988880040','18988880041','18988880042','18988880043'];
为了测试的方便我建立了几个数组:姓名、电话、email
定义一个生成xx位字符型的数字
//随机生成x位字符型的数字以方便测试用的
public function numStr($num)
{
static $seed = array(0,1,2,3,4,5,6,7,8,9);
$str = '';
for($i=0;$i<$num;$i ) {
$rand = rand(0,count($seed)-1);
$temp = $seed[$rand];
$str .= $temp;
//unset($seed[$rand]);
//$seed = array_values($seed);
}
return $str;
}
要测试的相关工作准备好了,开始学习测试知识点了
*知识点一:测试一下静态方法create
**1,代码如下
//静态更新数据的方法create
public function mcreate()
{
$i=random_int(1,43);
$data=[
'user_name' =>$this->name[$i],
'user_idcard' =>$this->numStr(18),
'user_password' =>'123',
'user_school' =>'神雕侠侣',
'user_mobile' =>$this->mobile[$i],
'user_email' =>$this->email[$i],
'user_qq' =>$this->numStr(8),
'user_status' =>rand(1,4),
];
$res = Users::create($data);
dump($res->toarray());
}
**2.效果如图
*知识点二. 自动消除多余的字段的方法allowfield和save
如果有一天我取得的数据中有一个数据表的没有字段,如果直接用insert就会出错的
如:
出错了
此时解决方法有两种,(1)用create方法或save方法,(2)如果你一定要用insert方法那就要用到自动消除字段的allowfield了
对于此方法开启有两种方式
一、在模型中开启
class Users extends Model{
//自动过滤掉不存在的字段
protected $field = true;
}
二在控制器中用allowFiedl方法
//控制器添加
$add = $user->allowField(true)->save($data);
这个测试就不放上来了,
*知识点三、软删除
**1.
第一步,你要在数据表中有一个字段是delete_time,
第二步要在模型中引入类:use thinkmodelconcernSoftDelete;,
第三步在模型中开启//开了软删除功能
use SoftDelete;
protected $deleteTime = 'delete_time';
好了可以测试了,下面是代码
//软删除
public function msoftdestroy()
{
$res=Users::destroy(16);
dump($res);
}
如果没有delete_time就会提示出错
修改好数据表中的delete_time字段后就成功了
此时可以看到数据表中delete_time有数据了
下面要测试一下能不查询出来
方式一:控制器用Db类查询方式,可以看到有数据还是查询出来了
方式二、用模型类查询方式:可以看到数据没有查询出来,实际数据还在数据库中的哦
*知识点四、自动时间戳
第一:数据表中要有两个字段:int数据型
create_time int(10) DEFAULT NULL COMMENT '创建时间',
update_time int(10) DEFAULT NULL COMMENT '更新时间',
第二:首先在模型中开启:
//开启自动时间戳
protected $autoWritetamp=true;
第三,你的CURD都不用理会它们的,它们会自动的
第四、从上面的查询可以看出用Db类查询出来是数字,用模型查询出来是自动会变成时间的格式,这也是模型类的好处哦