Correction status:Uncorrected
Teacher's comments:
主题:
实例演示闭包实现查询。
实例实现软删除功能并详细写出软删除的步骤。
代码及步骤解释:
首先需要创建模型类:
<?php // 创建模型的命名空间,对应路径 namespace app\index\model; // 引入框架模型类 use think\Model; // 引入软删除trait use think\model\concern\SoftDelete; // 创建模型类,由于框架模型类是抽象类无法实例化,这里创建的模型类需要继承框架的模型类才能使用框架模型类中的方法 class Car extends Model { // 在模型类中引入软删除类 use SoftDelete; // 创建模型类的方法,变量需要私有化,此处的变量$table和$pk是框架预定义的 protected $table = 'car'; protected $pk = 'car_id'; // 软删除时间 protected $deleteTime = 'delete_time'; // 默认软删除字段默认值 protected $defaultSoftDelete = 0; }
点击 "运行实例" 按钮查看在线实例
一、闭包查询(包括单条记录查询、多条记录查询、url请求动态查询)
<?php namespace app\index\controller; // 引入Cotroller类 use think\Controller; // 引入模型类,这里模型中的Car类与当前类重名了,需要更改成别名CarModel use app\index\model\Car as CarModel; // 创建Car类继承自Controller(框架控制器类) class Car extends Controller { // 模型操作数据库表:查询(单条查询,多条查询) public function query() { // (1)单条查询:使用框架的get(主键/闭包)方法,闭包是一个匿名回调函数,将函数作为参数传递 // 使用闭包参数,参数$query自动实例化了 $car = CarModel::get(function($query) { $query->where('price', '>', 100000); }); echo '价格大于10万的第一辆车:'; // return $car. '<br>'; dump($car); echo '<hr color="red">'; // (2)多条查询:使用框架的all(主键列表/闭包)方法 // 传入闭包 $cars = CarModel::all(function($query) { $query->where('price', '=', 80000); }); echo '价格等于80000的车:'; dump($cars); // 循环遍历方式输出 foreach($cars as $car) { echo '<hr color="red">'. '遍历车辆:'. '<br>'; echo '车辆名称:'. $car->car_name. '<br>'; echo '车辆类型:'. $car->car_type. '<br>'; echo '车辆颜色:'. $car->car_color. '<br>'; echo '车辆价格:'. $car->price. '<br>'; } echo '<hr color="red">'; // 使用闭包实现url请求传递参数动态查询 // $this->request:请求对象,相当于new \think\facade\Request $color = $this->request->param('car_color') ? : '红色'; $price = $this->request->param('price') ? : 200000; $cars = CarModel::all(function($query) use($color, $price) { $query->where('car_color', $color)->where('price', '>', $price); }); dump($cars); echo '<hr color="red">'; }
点击 "运行实例" 按钮查看在线实例
二、闭包更新
<?php namespace app\index\controller; // 引入Cotroller类 use think\Controller; // 引入模型类,这里模型中的Car类与当前类重名了,需要更改成别名CarModel use app\index\model\Car as CarModel; // 创建Car类继承自Controller(框架控制器类) class Car extends Controller { // 3.模型操作数据库表:更新 public function update(){ // 闭包操作,Db::raw()方法是5.1.10新增(如果使用了混合查询) CarModel::update(['price'=> \think\Db::raw('price+10000')], function($query) { $query->where('car_name', '本田'); } ); } }
点击 "运行实例" 按钮查看在线实例
三、添加(单条记录、多条记录)
<?php namespace app\index\controller; // 引入Cotroller类 use think\Controller; // 引入模型类,这里模型中的Car类与当前类重名了,需要更改成别名CarModel use app\index\model\Car as CarModel; // 创建Car类继承自Controller(框架控制器类) class Car extends Controller { // 4.模型操作数据库表:添加 public function create(CarModel $car) { // create(数据,字段) // 先准备数据 $data1 = [ 'car_name'=>'法拉利', 'car_type'=>'超跑', 'car_color'=>'红色', 'price'=>160000 ]; $data2 = [[ 'car_name'=>'法拉利', 'car_type'=>'超跑', 'car_color'=>'红色', 'price'=>160000 ],[ 'car_name'=>'现代', 'car_type'=>'伊兰特', 'car_color'=>'银色', 'price'=>70000 ]]; // 添加单条记录 // $field = ['car_name', 'car_type', 'car_color', 'price']; // CarModel::create($data1, $field); // 查询构造器方式,这里无法直接调用data()方法 // CarModel::insert($data1); // 添加多条记录,需要依赖注入方式 $car->saveAll($data2); } }
点击 "运行实例" 按钮查看在线实例
四、硬删除与软删除
<?php namespace app\index\controller; // 引入Cotroller类 use think\Controller; // 引入模型类,这里模型中的Car类与当前类重名了,需要更改成别名CarModel use app\index\model\Car as CarModel; // 创建Car类继承自Controller(框架控制器类) class Car extends Controller { // 5.模型操作数据库表:删除(切记工作中使用软删除!) // (1)硬删除 public function delete() { // destroy(主键/主键列表/闭包) // CarModel::destroy(10);先执行一个查询,再执行删除 // 闭包 // CarModel::destroy(function($query) { // $query->where('price', '>', 2000000); // }); // 查询构造器 // CarModel::where('price', '>', 2000000)->delete(); } // (2)软删除(不删除实际数据,可以随时恢复,回收站机制) public function softdelete() { // 使用更新模拟删除,需要在模型中引入软删除类SoftDelete // 相当于SQL语句:UPDATE `car` SET `delete_time` = 1527432257 WHERE `car_id` = 1 // CarModel::destroy(1); // 查询软删除后的记录 // $res = CarModel::where('car_id', '<' ,10)->select(); // 查询包括已软删除的记录 // $res = CarModel::withTrashed()->where('car_id', '<' ,10)->select(); // 只查询已软删除的记录 $res = CarModel::onlyTrashed()->select(); dump($res); } }
点击 "运行实例" 按钮查看在线实例
总结:
引入命名空间时注意重名问题;
写操作必须设置条件;
使用create方法新增数据,使用saveAll批量新增数据。
如果需要使用模型事件,那么就先查询后更新,如果不需要使用事件,直接使用静态的Update方法进行条件更新,如非必要,尽量不要使用批量更新。
如果删除当前模型数据,用delete方法,如果需要直接删除数据,使用destroy静态方法。
在模型外部使用静态方法进行查询,内部使用动态方法查询,包括使用数据库的查询构造器。模型的查询始终返回对象实例,但可以和数组一样使用。
尽量使用闭包。