手记

五十一章 TP51模型之增删改查

<?php 
namespace app\index\controller;
use think\Controller;
use app\index\model\Staff as StaffModel; //设置别名,防止与当前控制器冲突
class Staff extends Controller
{
    //模型查询
    public function query()
    {
        //1.单条记录:静态get(主键/闭包)方法
        $staff = StaffModel::get(2);  //以静态查询方式创建模型对象
        //如果查询条件复杂可以使用闭包方式创建查询条件
        $staff = StaffModel::get(function($query){
            $query->where('sex',0)->where('salary','>',8000);
        });        
        //模型可以静态调用所有的查询构造器方法
        echo '年龄大于50员工信息:';
        $staff = StaffModel::field('name,salary')->where('age','>',50)->find();
        //2.多条记录查询: all(主键列表/闭包)
        $staffs = StaffModel::all(); //获取所有员工信息    
        $staffs = StaffModel::all([1,2,3]); //返回主键=1,2,3的记录    
        //all()也支持闭包查询,这也是我们以后常用的方式
        $staffs = StaffModel::all(function($query){
            $query->where('age','<=',40)->where('salary','>',3000);
        });        
        //all()返回的数组,我们一般是采用循环的方式进行遍历
        foreach ($staffs as $staff) {
            echo '姓名:'.$staff->name.'<br>';
            echo '年龄:'.$staff->age.'<br>';
            echo '工资:'.$staff->salary.'<hr>';
        }
        //采用闭包的好处非常多,特别是支持查询变量从外部传入
        //举例,查询条件由用户通过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()
    {
        //创建要添加的数据
        $data = [
            'name'=>'孙悟空',
            'sex' => 0,
            'age' => 100,
            'salary' => 8888
        ];
        //设置允许添加的字段名,不在列表中的字段,有值也不会添加到表中,建议表中给该字段创建默认值
        $field = ['name','sex','age','salary'];
        StaffModel::create($data, $field);
        //也可以使用查询构造器添加数据, 
        StaffModel::insert($data);
    }
    //模型删除: 删除记录
    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);
    }
}
//分类求和
public function query(){
    $products = ProductModel::field('name,SUM(price) AS prices')->group('name')->select();
    foreach ($products as $product) {
        echo '名称:'.$product->name.'<br>';
        echo '价格:'.$product->prices.'<br>';
    }
    }
1人推荐
随时随地看视频
慕课网APP