模型基本操作及模型软删除的原理与实现

原创 2018-11-28 14:26:55 791
摘要:一、Db与模型的区别与联系?1.Db和模型的职责和定位不同;2.Db负责的只是数据(表)访问;3.模型是业务数据和业务逻辑的完美封装;4.Db是模型的基础,模型最终实现依赖Db实现;5.重点:Db返回是数组,模型返回的是对象二、模型与数据表之间的关系1.模型本质是一个类,继承自框架的think\Model.php类;2.模型大多与一张数据表对应,但并不总是这样;3.模型支持ORM(对象关系映射);

一、Db与模型的区别与联系?

1.Db和模型的职责和定位不同;

2.Db负责的只是数据(表)访问;

3.模型是业务数据和业务逻辑的完美封装;

4.Db是模型的基础,模型最终实现依赖Db实现;

5.重点:Db返回是数组,模型返回的是对象


二、模型与数据表之间的关系

1.模型本质是一个类,继承自框架的think\Model.php类;

2.模型大多与一张数据表对应,但并不总是这样;

3.模型支持ORM(对象关系映射);

4.模型对应数据表,而模型实例(对象)对应表中的一条记录

5.模型支持更多的业务处理功能:自动完成,自动转换,自动验证等等,这是Db不具备的



三、关于Db与模型的几个误区

1.认为模型效率不如直接操作Db,其实这点差别相对模型的便利性,简直可以直接忽略;

2.认为为每张数据表创建模型无意义,还麻烦,其实这是不对的,通过模型操作数据其实更加的安全可靠;

3.认为模型的操作不容易掌握,概念不容易理解,恰恰相反,模型相对Db更加的人性,也更贴近开发需求;


四、模型的优势

1.可以更优雅的操作数据,完全面向对象编程;

2.可以更加的直观的实现多表的关联操作;

3.可以最大限度的保证用户数据的安全性和完整性;

4.可以非常方便的扩充业务逻辑功能;

5.可以极大的减少控制器中的业务逻辑代码.

<?php 
	namespace app\index\controller;
	use think\Controller;
	use app\index\Model\User as UserModel;

	class User extends Controller
	{
		public function instance(UserModel $user)//依赖注入
		{
			// 新增一条记录
			$user ->name = 'ma';
			$user ->age = 18;
			$user ->sex = 0;

			$user ->save();
			return '新增成功,id=' .$user->user_if;
		}

		// 1.模型查询
		public function query()
		{
			// 1.单条记录:静态get(主键/闭包)方法
			// 闭包就是一个匿名回调函数
			// 此时完成二个操作:1.创建模型对象 2.模型对象初始化(赋值)
			$user = UserModel::get(1);//以静态查询方式创建莫得对象
			dump($user);//dump()是框架内置调试函数,对数据做了预处理,返回数据

			\var_dump($user);//全局var_dump()才能看到原始数据类型:Object
			// 所以查看某一个字段的值,即可以用数组方式,也可以用对象方式
			echo $user['name'],'<br>';
			echo $user->name,'<br>';

			echo '<hr>';

			// 如果查询条件复杂,可以使用闭包方式创建查询条件
			$user = UserModel::get(function($query)
			{
				$query->where('sex',0)->where('salary','>',8000);
			});
			echo '性别为男,工资大于8000的员工信息:<br>';
			dump($user);
			echo '<hr>';

			// 也可以直接调用Db类的查询构造器来进行查询
			// 模型可以静态调用所有的查询构造器方法
			$user = UserModel::field('name,salary')->where('age','>',50)->find();
			dump($user);
			echo '<hr>';

			// 多条记录查询:all(主键列表/闭包)
			// 返回值是一个多维数组/对象数组
			$user = UserModel::all();
			$user = UserModel::all([1,2,3]);//返回主键=1,2,3的记录
			dump($user);
			echo '<hr>';

			// all()也支持闭包查询,基本就是以后常用的方式
			$users = UserModel::all(function($query){
				$query->where('age','>',50)->where('salary','>',3000);
			});
			dump($users);
			echo '<hr>';

			// all()返回的数组,一般采用循环的方式进行遍历
			foreach ($users as $user) {
				echo '姓名:'. $user->name . '<br>';
				echo '年龄:'. $user->age . '<br>';
				echo '工资:'. $user->salary . '<br>';
			}
			echo '<hr>';

			// 采用闭包的好处非常多,特别是支持查询变量从外部传入
			// 例如:查询条件由用户URl请求提供
			// 控制器提供一个属性$request,其值就是请求对象,可用来快速请求变量
			// 如果当前请求变量中的age和salary由获取到,否则使用默认值40,3000
			// 在使用请求对象的时候,依赖注入 Request $request
			$age = $this ->request ->param('age') ?: 40;
			$salary = $this ->request ->param('salary') ?: 3000;

			// 连接闭包和外界变量的关键字:USE
			// 闭包可以保存所在代码块上下文的一些变量和值。PHP在默认情况下,匿名函数不能调用所在代码块的上下文变量,而需要通过使用use关键字。
			$users = UserModel::all(function() use ($age,$salary){
				$query ->where('age','<=',$age)->where('salary','>',$salary);

			});
			dump(users);

		}

		// 2.模型更新
		public function update()
		{
			// 更新必须是基于查询的,不允许无条件更新
			// 2.1 最简单直观的方式是先查询,再用模型调用save()
			$user = UserModel::get(2);
			$user ->name = 'math';
			$user->save();//将更新数据写到表中,返回受影响数量

			// 2.2 但是,强烈推荐使用静态方法:update(数据,条件,字段),返回模型对象
			UserModel::update(['name'=>'math'],['user_id'=>2]);

			// 2.2.1进行一个比较复杂的操作
			UserModel::update(['salary' => \think\Db::raw('salary+500')],//数据使用原始值调用
				function($query){//条件使用闭包
					$query->where('age','>',50);
				}
				);

			// 2.3 也可以使用查询构造器来更新数据
			UserModel::where('age','>',50)->data(['salary'=>\think\Db::raw('salary+500')]) ->update();

			// 总结:在开发过程中,具体使用哪种方式随你,但我推荐使用静态update
		}

		// 3.模型创建:添加数据
		public function create()
		{
			// 前面已经用save()方法添加过一条记录
			// 3.1 现在,我们用静态 create(数据,字段)方法来完成同样的功能
			// 3.1.1 创建要添加的数据
			$data = [
				'name' =>'math',
				'sex' =>0,
				'age' =>18,
				'salary' =>10000
			];

			// 3.1.2 设置允许添加的字段名,不在列表中的字段,有值也不会添加到列表中,建议表中给该字段创建默认值
			$field = ['name','sex'];
			UserModel::create($data,$field);

			// 3.2 也可以使用查询构造器添加数据
			UserModel::data($data)->insert();
		}

		// 4.模型删除:删除记录
		public function delete()
		{
			// 4.1 删除采用静态方法destory(主键/闭包)
			UserModel::destroy(2);
			UserModel::destroy([1,2,3]);//支持多主键

			// 4.2 删除条件推荐使用闭包查询
			UserModel::destroy(function($query){
				$query ->where('age','>',55)->where('salary','>',5000);
			});

			// 4.3 也可使用查询构造器删除数据
			UserModel::where('age','<',18)->delete();
		}

		// 5.软删除:必须在模型中进行先行配置
		/**
		 * 实现软删除功能的步骤
		 * 5.1 在数据表中新增delete_time字段(字段名可自定义)
		 * 5.2 在模型中导入trait类:SoftDelete
		 * 5.3 设置模型属性 protected $deleteTime = '删除时间字段名';
		 * 5.4 设置软删除字段默认值[可选]
		 * 使用软删除功能,必须先导入model/concern/SoftDelete.php
		use think\model\concern\SoftDelete;    //实际上一个trait方法集
		 */
		public function softDelete()
		{
			UserModel::destroy(1);
			// 生成的SQL语句不是删除,而是更新
			// UPDATE 'user' SET 'delete_time' = 1527148290 WHERE 'user_id' = 1
			
			// 软删除记录不会出现在查询结果中
			$res = UserModel::withTrashed()->where('user_id<5')->select();

			// 如果只选查询已经被软删除的数据(回收站)
			$res = UserModel::onlyTrashed()->select();

			dump($res);
		}
	}




 ?>


批改老师:天蓬老师批改时间:2018-11-28 15:06:01
老师总结:Db与模型,本质上是一样的, 模型的底层,仍是用Db类方式来实现的, 所以, 数据库查询方法, 仍是学习重点

发布手记

热门词条