thinkphp5.1的模型

原创 2018-11-25 15:57:55 667
摘要:第一:Db与模型的区别一、Db与模型的区别与联系?1.Db和模型的职责和定位不同;2.Db负责的只是数据(表)访问;3.模型是业务数据和业务逻辑的完美封装;4.Db是模型的基础,模型最终实现依赖Db实现;5.重点来了:Db返回是数组,模型返回的是对象可能同学们一时对这些描述不是很理解,相信随着学习的深入和开发经验的积累,会对模型有更深的理解。----------------------------

第一:Db与模型的区别

一、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.可以极大的减少控制器中的业务逻辑代码.

--------------------------------------------------------------------------------

五、改进要求

1.如果模型中写了很少的代码,甚至是空模型,那么要检查你的业务规划是不是有了问题

2.如果控制器中写了大量的数据处理代码,那么最好将这些代码移到模型中去统一处理

第二:模型的操作和软删除

一、创建模型

1. 编程方式: application/index/model/Staff.php

2. 命令方式:

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

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

model目录,则自动创建;

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

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

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

--------------------------------------------------------------------------------

二、调用模型

use app\index\model\Staff;

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

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

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

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

<?php

namespace app\index\model;

/**

* 实现软删除功能的步骤

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

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

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

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

*/

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;

}

//////////////////////////////////////////////////////////////////////////////////////////////////控制器的写法////////////////////////////////////////////////////////////////////////////////////////////////////////////

<?php

namespace app\index\controller;

use think\Controller;

use app\index\model\Staff as StaffModel; //设置别名,防止与当前控制器冲突

class Staff extends Controller

{

// public function show()

public function instance(StaffModel $staff) //依赖注入

{

// $staff = new StaffModel();

// dump($staff->getName()); //模型名称

//新增一条记录

$staff->name = 'peter';

$staff->sex = 0;

$staff->age = 18;

$staff->salary = 4800;

$staff->save();

return '新增成功,id='.$staff->staff_id;

//实际工作中,我们几乎全部采用模型的静态方法调用来实现数据操作

}

//模型查询

public function query()

{

//1.单条记录:静态get(主键/闭包)方法

//闭包就是一个匿名回调函数

//此时完成了二个操作:1.创建模型对象 2. 模型对象初始化(赋值)

$staff = StaffModel::get(2);  //以静态查询方式创建模型对象

dump($staff);  //dump()是框架内置调试函数,对数据做了预处理,返回数组

\var_dump($staff);  //全局var_dump()才能看到原始数据类型:Object

//所以查看某一个字段的值,即可以用数组方式,也可以用对象方式

echo $staff['name'],'<br>';  //数组方式

echo $staff->salary,'<br>';  //对象方式

echo '<hr>';

//如果查询条件复杂可以使用闭包方式创建查询条件

$staff = StaffModel::get(function($query){

$query->where('sex',0)->where('salary','>',8000);

});

echo '性别为男,工资大于8000的员工信息:<br>';

dump($staff);

echo '<hr>';

//也可以直接调用Db类的查询构造器来进行查询

//模型可以静态调用所有的查询构造器方法

echo '年龄大于50员工信息:';

$staff = StaffModel::field('name,salary')->where('age','>',50)->find();

dump($staff);

echo '<hr>';

//2.多条记录查询: all(主键列表/闭包)

//返回值是一个多维数组/对象数组

$staffs = StaffModel::all(); //获取所有员工信息

dump($staffs);

echo '<hr>';

$staffs = StaffModel::all([1,2,3]); //返回主键=1,2,3的记录

dump($staffs);

echo '<hr>';

//all()也支持闭包查询,这也是我们以后常用的方式

$staffs = StaffModel::all(function($query){

$query->where('age','<=',40)->where('salary','>',3000);

});

dump($staffs);

echo '<hr>';

//all()返回的数组,我们一般是采用循环的方式进行遍历

foreach ($staffs as $staff) {

echo '姓名:'.$staff->name.'<br>';

echo '年龄:'.$staff->age.'<br>';

echo '工资:'.$staff->salary.'<hr>';

}

echo '<hr color="red">';

//采用闭包的好处非常多,特别是支持查询变量从外部传入

//举例,查询条件由用户通过URL请求提供

//控制器提供一个属性$request,其值就是请求对象,可用来快速请求变量

//如果当前请求变量中存在age和salary由获取到,否则使用默认值40,3000

$age = $this->request->param('age') ?: 40;

$salary = $this->request->param('salary') ?: 3000;

$staffs = StaffModel::all(function($query) use ($age, $salary){

$query->where('age','<=',$age)->where('salary','>',$salary);

});

dump($staffs);

}

//模型更新

public function update()

{

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

//最简单直观的方式是先查询,再模型调用save()

$staff = StaffModel::get(2); //查询获取到要更新的记录

$staff->name = '龙姑娘';  //更新记录字段

$staff->save();  //将更新数据写到表中,返回受影响数量

//强烈推荐使用静态方法:update(数据,条件,字段),返回模型对象

//改写上面案例,将龙姑娘更改回小龙女

StaffModel::update(

['name'=>'小龙女'],

['staff_id'=>2]

);

//下面我们进行一个更加复杂的更新操作

//将年龄大于50的员工的工资加500

StaffModel::update(

['salary'=> \think\Db::raw('salary+500')],  //数据使用原始值调用

function($query){   //条件使用闭包

$query->where('age','>',50);

}

);

//也可以使用查询构造器来更新数据

StaffModel::where('age','>',50)

->data(['salary'=> \think\Db::raw('salary+500')])

->update();

//在开发过程中,具体使用哪种方式随你,但我推荐使用静态update()方法

}

//模型创建: 添加数据

public function create()

{

//刚才我们用save()方法添加过一条记录

//下面我们用静态create(数据,字段)方法来完成同样的功能

//创建要添加的数据

$data = [

'name'=>'孙悟空',

'sex' => 0,

'age' => 100,

'salary' => 8888

];

//设置允许添加的字段名,不在列表中的字段,有值也不会添加到表中,建议表中给该字段创建默认值

$field = ['name','sex','age','salary'];

StaffModel::create($data, $field);

//也可以使用查询构造器添加数据,也非常简单,请课后自行练习

StaffModel::data($data)->insert();

}

//模型删除: 删除记录

public function delete()

{

//删除采用静态方法destory(主键/闭包)

StaffModel::destroy(43);

StaffModel::destroy([55,56,99]); //支持多主键

//删除条件推荐使用闭包查询

//删除年龄大于等于55岁,工资大于等于5500元的员工

StaffModel::destroy(function($query){

$query->where('age','>=',55)->where('salary','>=',5000);

});

//可以使用查询构造器删除数据:删除年龄小于20岁的员工,不执行了,结果大家应该可预知

StaffModel::where('age','<',20)->delete();

}

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

public function softDelete()

{

// StaffModel::destroy(1);

//生成的SQL语句不是删除,而是更新:

//UPDATE `staff` SET `delete_time` = 1527148290 WHERE `staff_id` = 1

//软删除记录不会出现在查询结果中

$res = StaffModel::where('staff_id < 5')->select();

//如果想让查询结果包括已经软删除的记录

$res = StaffModel::withTrashed()->where('staff_id<5')->select();

//如果只想查询已经被软删除的数据(回收站)

$res = StaffModel::onlyTrashed()->select();

dump($res);

}

}

、、


发布手记

热门词条