Blogger Information
Blog 71
fans 1
comment 1
visits 86725
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
524-ThinkPHP5.1之模型操作及软删除
小威的博客
Original
3756 people have browsed it
  • 创建模型的方法

  • 手动创建模型文件: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.可以极大的减少控制器中的业务逻辑代码.

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post