博客列表 >524-ThinkPHP5.1之模型操作及软删除

524-ThinkPHP5.1之模型操作及软删除

小威的博客
小威的博客原创
2018年05月25日 13:47:013755浏览
  • 创建模型的方法

  • 手动创建模型文件:application/index/model/Staff.php

<?php
namespace app\index\model;
use think\Model;
class Staff extends Model
{
    //设置数据表名
    protected $table = 'staff';
    //设置主键
    protected $makey = 'staff_id';
}
  • 命令行创建模型目录方式: 

1. 切换think命令所在目录下;

2. 运行: php think make:model index/Staff,自动创建index/model/Staff.php,如果没有

model目录,则自动创建;

3.运行: php think make:model Staff,如果省略模块名,默认为common模块,

模型位于:application/common/model/Staff.php,common模块如果不存在也会自动创建;

QQ截图20180525084848.png

  • 默认情况下:Staff模型与数据表staff对应

  • 调用模型           use app\index\model\Staff;

1. 实例化调用: $staff = new Staff();

2. 静态查询调用: $staff = Staff::get();

3. 助手函数调用: $staff = model('Staff'); 

不推荐用助手函数,因为model()无法调用模型静态方法

  • 模型实例化:Users.php

<?php
namespace app\index\controller;
use think\Controller;
//如果有重名,设置别名,防止与当前控制器冲突,如:Staff as StaffModel;
use app\index\model\Staff;
class Users extends Controller
{
	//实例化模型
	public function instance(Staff $staff)//依赖注入
	{
		$staff->name = '曹操';
		$staff->sex = 0;
		$staff->age = 68;
		$staff->salary = 20000;
		$staff->save();
		return '新增成功,ID='.$staff->staff_id;
	}
}

QQ截图20180525094130.png

  • 模型操作:

  • 模型查询:查询记录 query()

查询单条记录:静态get(主键/闭包:就是一个匿名函数)方法/闭包查询方法:

<?php
	public function query()
	{
		//查询单条记录:静态get(主键/闭包:就是一个匿名函数)方法
		//查询操作:1.创建模型对象 2. 模型对象初始化(赋值)
		$staff = Staff::get(5);  //以静态查询方式创建模型对象

		echo '<h3>'.'dump()是框架内置调试函数,对数据做了预处理,返回数组'.'</h3>';
		dump($staff);  //dump()是框架内置调试函数,对数据做了预处理,返回数组
		echo '<hr color="red">';
		echo '<h3>'.'全局var_dump()才能看到原始数据类型:Object'.'</h3>';
		\var_dump($staff);  //全局var_dump()才能看到原始数据类型:Object
		echo '<hr color="red">';
		//所以查看某一个字段的值,即可以用数组方式,也可以用对象方式
		echo '<h3>'.'数组方式'.'</h3>';
		echo '姓名:'.$staff['name'],'<br>';  //数组方式
		echo '性别:'.$staff['sex'],'<br>';  //数组方式
		echo '<hr color="green">';
		echo '<h3>'.'对象方式'.'</h3>';
		echo '年龄:'.$staff->age,'<br>';  //对象方式
		echo '工资:'.$staff->salary,'<br>';  //对象方式
		echo '<hr color="red">';
	}

QQ截图20180525101310.png

  • 查询条件复杂

 1.使用闭包方式创建查询条件进行查询

<?php
	public function query()
	{
	$staff = Staff::get(function($query)){
			$query->where('sex',1)->where('salary','<',5000);
			echo '<h3>工资低于5000元的女同事:</h3>';
			dump($staff);
		}

 2.直接调用Db类的查询构造器来进行查询--模型可以静态调用所有的查询构造器方法

<?php
	public function query()
	{
	echo '<h3>年龄超过80岁的男同事:</h3>';
		$staff = Staff::field(['name'=>'姓名','sex'=>'性别','age'=>'年龄','salary'=>'工资'])
				->where('age','>',80)
				->where('sex',0)
				->find();
		return $staff;
	}

QQ截图20180525105126.png

  • 多条记录查询: all

主键列表查询:返回值是一个多维数组/对象数组

<?php
	public function query()
	{
	$staffs = Staff::all(); //获取所有员工信息
        dump($staffs);
        echo '<hr>';
        
        $staffs = Staff::all([1,2,3]); //返回主键=1,2,3的记录
        return $staffs;
        echo '<hr>';
        }

闭包查询:一般是采用循环的方式进行遍历

<?php
	public function query()
	{
	$staffs = Staff::all([10,26,38,41,50]);
		foreach ($staffs as $staff) {
			echo '姓名:'.$staff->name.'<br>';
			echo '年龄:'.$staff->age.'<br>';
			echo '工资:'.$staff->salary.'<hr>';
	}

QQ截图20180525111021.png

闭包查询支持查询变量从外部传入:例如:查询条件由用户通过URL请求提供

<?php
	public function query()
	{
	       $sex = $this->request->param('sex') ?: 0;
		$age = $this->request->param('age') ?: 20;
		$salary = $this->request->param('salary') ?: 5000;

		$staffs = Staff::all(function($query) use ($sex, $age, $salary){
			$query->where('sex','=',$sex)->where('age','<=',$age)->where('salary','<=',$salary);
		});
		dump($staffs);
	}

注意点:1.控制器提供一个属性$request,其值就是请求对象,可用来快速请求变量

QQ截图20180525112424.png

注意点:2.如果外部请求没有赋属性值 则取默认值(sex=0  age<=20  salary<=5000)

  • 模型更新:更新数据 update()

更新必须是基于查询的,不允许无条件更新

1.简单直观的方式:先查询,再模型调用save()

$staff = Staff::get(15); //查询获取到要更新的记录
$staff->name = '姑姑';  //更新记录字段
return $staff->save() ? '更新成功' : '没有记录被更新';  //将更新数据写到表中,返回受影响数据

2.静态方法:update(数据,条件,字段),返回模型对象

Staff::update(
	['name'=>'小龙女'],
	['staff_id'=>15]
		);

3.条件更新操作

//将年龄大于80的员工的工资加2000
Staff::update(
	['salary'=> \think\Db::raw('salary+2000')],  //数据使用原始值调用
	function($query){   //条件使用闭包
	$query->where('age','>',80);
	}
	);
//使用查询构造器来更新数据
StaffModel::where('age','>',80)
	->data(['salary'=> \think\Db::raw('salary+1000')])
	->update();
  • 模型创建:新增数据 create()

public function create()
	{
		//创建要添加的数据
		$data1 = [
			'name'=>'孙悟空',
			'sex' => 0,
			'age' => 100,
			'salary' => 8888
		];
		//设置允许添加的字段名,不在列表中的字段,有值也不会添加到表中,建议表中给该字段创建默认值
		$field = ['name','sex','age','salary'];
//INSERT INTO `staff` (`name` , `sex` , `age` , `salary`) VALUES ('孙悟空' , 0 , 100 , 8888) 		
        //1.用静态create(数据,字段)方法来添加一条记录
		Staff::create($data1, $field);
		
		//创建要添加的数据
        $data2 = [
			'name'=>'通臂猿猴',
			'sex' => 0,
			'age' => 100,
			'salary' => 18888
		];
		//2.用查询构造器添加数据
		Staff::->insert($data2);
//INSERT INTO `staff` (`name` , `sex` , `age` , `salary`) VALUES ('通臂猿猴' , 0 , 100 , 18888)
	//3.用查询构造器添加多条数据
	$data = [
			['name' => '唐僧','sex' => 0,'age' => 48,'salary' => 900],
			['name' => '猪八戒','sex' => 0,'age' => 97,'salary' => 3200],
			['name' => '沙悟净','sex' => 0,'age' => 83,'salary' => 5800],
			['name' => '白龙马','sex' => 0,'age' => 53,'salary' => 8700],
		];
		Staff::insertAll($data);
	}
  • 模型删除:删除记录 delete()

public function delete()
	{
		//1.删除采用静态方法destory(主键/闭包)
		//Staff::destroy(43);
		//Staff::destroy([55,56,99]); //支持多主键
		
		//2.根据条件删除记录推荐使用闭包查询
		
		//删除年龄大于等于55岁,工资大于等于15000元的员工
		Staff::destroy(function($query){
			$query->where('age','>=',55)->where('salary','>=',15000);
		});

		//可以使用查询构造器删除数据:删除年龄大于90岁的员工
		//Staff::where('age','>',90)->delete();
	}

QQ截图20180525133308.png

  • 软删除:必须在模型中进行先行配置

实现软删除功能的步骤

 * 1.在数据表中新增delete_time字段(字段名可自定义)

 * 2.在模型中导入trait类:SoftDelete

 * 3.设置模型属性 protected $deleteTime = '删除时间字段名';

 * 4.设置软删除字段默认值[可选]

<?php

namespace app\index\model;
use think\Model;
//使用软删除功能,必须先导入model/concern/SoftDelete.php
use think\model\concern\SoftDelete;    //实际上一个trait方法集
class Staff extends Model
{
	use SoftDelete;
	
    protected $table = 'staff';
    protected $pk = 'staff_id';

    //设置删除时间字段,配合软删除功能
    protected $deleteTime = 'delete_time';
    //设置软删除字段的默认值
    protected $defaultSoftDelete = 0;    
}

添加数据库表字段:delete_time     重点:一般关于时间轴字段  类型 int  长度 > 10

QQ截图20180525133906.png

public function softDelete()
	{
		Staff::destroy(2);
		//生成的SQL语句不是删除,而是更新:
		//UPDATE `staff` SET `delete_time` = 1527148290 WHERE `staff_id` = 1 
		
		//软删除记录不会出现在查询结果中
		$res1 = Staff::where('staff_id < 3')->select();

		//如果想让查询结果包括已经软删除的记录
		$res2 = Staff::withTrashed()->where('staff_id<3')->select();

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

		dump($res1);
		echo '<hr color="red">';
		dump($res2);
		echo '<hr color="red">';
		dump($res3);
		echo '<hr color="red">';
	}

QQ截图20180525134653.png

软删除恢复:

//恢复被软删除的数据
    	 $res = Staff::onlyTrashed() -> find(2);
    	 $res -> restore();

QQ截图20180526092237.png

  • 知识点:

  • ThinkPHP5.1之模型

模型和Db的关系:模型是业务数据和业务逻辑的完美封装,Db是模型的基础,模型最终实现依赖Db实现

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

  • 模型与数据表之间的关系

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

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

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

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

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

  • 模型的优势

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

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

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

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

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

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议