《TP5.0学习笔记---模型篇(一)》
来源:互联网 发布:win10 dhcp服务器软件 编辑:程序博客网 时间:2024/06/10 02:44
一、什么是模型
为什么我们要在项目中使用模型,其实我们知道,我们可以直接在控制器中进行数据库的增、删、改、查,其实已经能基本完成我们的需求,但是,为什么还要有模型的存在呢?
比如说我们现在要做一个用户注册的操作,用户注册我们可能用两个表来保存用户的信息,一个是user表(保存用户基本信息),一个是user_info表(保存用户扩展信息,比如爱好等等),如果我们现在直接在我们的控制器中编写,那么我们需要对数据库两个表进行操作,我们就需要写两个db的方法来进行操作,我们需要将这些方法进行封装,最后放在模型里,只要执行这个模型里的某一个方法,那么就会自动完成我们所有操作的操作,也就是说,把我们数据库完成同一件事情的操作,放在一个公共方法里,这样我们在控制器里进行调用就会变得很方便。特别是代码复用的部分,我们可以编写这样的方法,让我们在任何地方可以使用用户注册这个方法。那么下面就看看如何定义模型:
首先在我们的application/index/创建一个model目录,专门放模型文件,然后在model目录下创建一个User.php文件
模型文件的命名规范: 首先我们的模型名和我们的表名要是对应的。比如我们要写我们数据库中的shulv_user表,那么我们的模型名就是去掉前缀之后使用驼峰的命名方式,也就是User.php,当数据库中有这种包含下划线的表名时,去掉下划线,并将下划线后边的字母大写,即时模型名,shulv_user_info 对应模型名就是UserInfo,这样他就会自动对应到数据库中的表。下边写代码验证一下:
namespace app\index\controller;use think\Controller;use app\index\model\User;//使用我们刚刚新建的那个模型class Index extends Controller{ public function index() { $res = User::get(51);//通过get()方法,取出user表中的id=51的这条数据(现在可以不用知道为什么使用get方法,后边会说) $res = $res->toArray();//将取出的数据转换成数组 dump($res); }}
你会发现,我们没有在模型中的User.php中编写任何的代码,但是在控制器中use进来User模型之后,就可以直接使用静态方法,这是为什么呢?
因为在我们的模型文件中的类都继承了think\Model这个类,think\Model中其实有这样的方法,这些方法,后边会说到。同样我们还可以在控制器中使用new的方式
$user = new User(); $res = $user::get(53); $res = $res->toArray(); dump($res);
当我们,不想通过use的方式将User模型引入进来的时候,我们还可以通过下边的方法:
namespace app\index\controller;use think\Controller;//use app\index\model\User;//使用我们刚刚新建的那个模型use think\Loader;//通过引入think下的Loader类class Index extends Controller{ public function index() { $user = Loader::model("User");//通过Loader下的model这个静态方法来引入对应模型 $res = $user::get(52); $res = $res->toArray(); dump($res); }}//说明:这种方式,是当我们的控制器下有多个模型的时候,我们使用这种方式,这样我们就不用在使用每一个模型的时候都use一下,我们直接使用Loader::model()这种方法直接引入。另外,它还提供了一个助手函数model(),此时我们连Loader类都不用引入了/* $user = model("User"); $res = $user::get(52); $res = $res->toArray(); dump($res);*///在这里建议大家使用前两种方式,因为助手函数式可能被覆盖掉的,当然这种情况很少发生,但是为了避免,或者让我们的代码可读性更高,建议大家使用第一种方式,也就是将需要的模型都use进来,通过它的静态方法来获取数据,这样我们的代码看起来更清晰,我们可以在最上边就看见我们当前的控制器使用了哪些模型类,这样在后期维护中会变得很方便
二、通过模型进行数据查询
namespace app\index\controller;use think\Controller;use app\index\model\User;//使用我们刚刚新建的那个模型//use think\Loader;//通过引入think下的Loader类class Index extends Controller{ public function index() { //之前我们查询一条数据的时候是通过给get()方法传递一个主键来获取对应数据,我们还可以传递一个闭包函数 $res = User::get(function($query){//在这里边构造查询条件 $query->where("id", "eq", 55);//这里条件的构造和前边的博客中说的一样(同样可以在后边继续添加链式方法) }); $res = $res->toArray(); dump($res); }}
我们还可以通过下边这种方法构造where条件
namespace app\index\controller;use think\Controller;use app\index\model\User;//使用我们刚刚新建的那个模型//use think\Loader;//通过引入think下的Loader类class Index extends Controller{ public function index() { $res = User::where("id", 51) ->find();//同样我们可以在后边添加更多的链式方法 $res = $res->toArray(); dump($res); }}/*当我们想获取表中的多条数据时,我们可以使用User::all();参数是主键名,可以使用字符串的方式,也可以使用数组的方式$res = User::all("1,2,3");//这个时候返回的每一条记录都是一个对象,我们就可以通过foreach进行遍历输出//或$res = User::all([1,2,3]);foreach($res as $value){ dump($value->toArray());//这个时候我们就会获得三条数据}//这个all()还可以接收一个闭包函数作为参数,来构造where条件$res = User::all(function($query){ $query->where("id", "<", 5); //同样可以添加更多的链式方法});*/
当我们想要获取单独的一个字段,我们知道Db类有一个value() 方法,模型我们也可以这样
$res = User::where()->value("email");//直接返回的是字符串dump($res);//获取某一个字段那一列时$res = User::column("email");//返回的是一个数组
三、使用模型添加数据
在thinkphp,它的model为我们提供了一个create()方法(静态方法),直接向数据库中插入数据
namespace app\index\controller;use think\Controller;use app\index\model\User;//使用我们刚刚新建的那个模型//use think\Loader;//通过引入think下的Loader类class Index extends Controller{ public function index() { $res = User::create([ 'username' => 'shulv', 'password' => md5('shulv'), 'email' => 'shulv@qq.com', 'num' => 100 ]);//它的返回结果依然是一个对象 dump($res->id);//获得此时的自增id dump($res); }}
namespace app\index\controller;use think\Controller;use app\index\model\User;//使用我们刚刚新建的那个模型//use think\Loader;//通过引入think下的Loader类class Index extends Controller{ public function index() { // $res = User::create([ // 'username' => 'shulv', // 'password' => md5('shulv'), // 'email' => 'shulv@qq.com', // 'num' => 100 // 'demo' => 15245 // ]);//当我们要插入一个表中并没有的字段时,不传递第二个参数时,运行时会报错,说该字段不存在(此时数据库也并不会插入这条数据)/* 我们知道,当前台传递数据时,往往直接传到$_POST中,我们会将POST中所有的数据插入到表中,那么我们就应该让它有的就插入表中,没有的就不插入,此时我们就需要给它传入第二个参数"true"*/ $res = User::create([ 'username' => 'shulv1', 'password' => md5('shulv1'), 'email' => 'shulv1@qq.com', 'num' => 101, 'demo' => 15245 ],true); dump($res); }}
当我们仅允许添加指定的字段时,我们可以将第二个参数传递一个数组,数组中的元素就是,你指定添加的字段
public function index() { $res = User::create([ 'username' => 'shulv2', 'password' => md5('shulv2'), 'email' => 'shulv2@qq.com', 'num' => 102, 'demo' => 145 ],['username','password']); dump($res->id); }
模型中还为我们提供了一个save()方法来插入数据(如果我们想使用save()就要先实例化我们的模型)
namespace app\index\controller;use think\Controller;use app\index\model\User;//使用我们刚刚新建的那个模型//use think\Loader;//通过引入think下的Loader类class Index extends Controller{ public function index() { $userModel = new User; //那么此时,我们就可以对数据库进行添加的操作了 $userModel->username = 'shulv3'; $userModel->password = md5('shulv3'); $userModel->email = 'shulv3@qq.com'; $userModel->num = 103; $userModel->save(); dump($userModel->id); }}
当然我们还可以使用一种简单的方法,就是直接给save()传递一个数组,数组的元素为插入的值,就像create()方法传递参数那样。不一样的地方是,但遇见插入的字段,表中不存在的时候,它的处理方法是调用一个allowField()方法
$userModel = new User; $res = $userModel ->allowField(true) ->save([//allowField('true')也可以传递一个数组,元素为允许插入的字段名 'username' => 'shulv4', 'password' => md5('shulv5'), 'email' => 'shulv@qq.com', 'demo' => 123 ]);//返回值是插入的条数 dump($res);
那么当我们想要添加多条记录时,我们可以使用saveAll()方法,参数为一个二维数组
public function index() { $userModel = new User; $res = $userModel->saveAll([ ['email' => 'shulv4@qq.com'], ['email' => 'shulv5@qq.com'] ]);//我这里只插入了email foreach($res as $value){ dump($value->id); //dump($value->toArray()); } }
- 《TP5.0学习笔记---模型篇(一)》
- 《TP5.0学习笔记---模型篇(二)》
- 《TP5.0学习笔记---模型篇(三)》
- 《TP5.0学习笔记---配置篇》
- 《TP5.0学习笔记---配置篇》
- 《TP5.0学习笔记---对Mysql数据库的操作(一)》
- tp5模型笔记---一对一
- 《TP5.0学习笔记---URL和路由篇》
- 《TP5.0学习笔记---请求和响应篇》
- 《TP5.0学习笔记---视图和模板篇 》
- 《TP5.0学习笔记---系统变量原生标签篇》
- 《TP5.0学习笔记---请求和响应篇》
- 《TP5.0学习笔记---视图和模板篇 》
- tp5模型笔记---一对多
- 《TP5.0学习笔记---百度地图封装》
- TP5代码学习笔记:Loader
- tp5模型笔记---多对多
- 声学模型学习笔记(一) HMM
- mybanner—— banner + listview
- Arduino开发之Digital Push Button(Red)
- python 的FileNotFoundError处理和例子
- 运算符重载
- MySql 索引(一)
- 《TP5.0学习笔记---模型篇(一)》
- 机器学习中数据采样方式
- 游戏中的设计模式九(命令模式)
- Atom编辑器常用快捷键列表汇总整理
- OpenMS build 遇到的问题
- MFC实现打印功能
- 数据结构实验之图论四:迷宫探索
- Spring Boot+thymeleaf 静态资源上下文的问题
- 68.笔记 MySQL学习——C编写MySQL程序一准备