tp6Day2--数据库操作注意事项

99 阅读2分钟

1.基础查询

public function index()
    {
        //游标查询功能
//        $cursor = Db::table('tp_user')->cursor();
//        foreach($cursor as $user){ dump($user);break; }

        //分批处理数据
//        Db::name('user')->chunk(1,function ($users){
//            foreach ($users as $user){
//                dump($user);
//            }
//            echo 222;
//        });


//        $user = Db::name('user')->column('username', 'id');
//        $user = Db::name('user')->column('username');
//        $user = Db::table('tp_user')->select()->toArray();
//        $user = Db::table('tp_user')->where('id', 19)->findOrFail();
//        return json($user);
//        $user = Db::table('tp_user')->where('id',19)->find();
//        return Db::getLastSql();
//        $user = Db::table('tp_user')->select();
//        return json($user);

//        dump($user);
//        halt(111);
    }

    /**
     * User: wuJiaWei
     * DateTime: 2024/6/22 10:49:51
     * describe:数据库切换
     * @return \think\response\Json
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function demo()
    {
        $user = Db::connect('demo')->table('tp_user')->field(true)->select();
        return json($user);
    }

    /**
     * User: wuJiaWei
     * DateTime: 2024/6/22 10:50:10
     * describe:模型调用
     * @return User[]|array|\think\Collection
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function getUser()
    {
        return User::select();
    }

2. 数据库的新增

save、insert、insertGetId、insertAll、replace、strict(false)

save()新增

1. save()方法是一个通用方法,可以自行判断是新增还是修改(更新)数据; 2. save()方法判断是否为新增或修改的依据为,是否存在主键,不存在即新增; Db::name('user')->save($data);

public function addPost()
    {
        $data = [ 'id'=>303,'username' => 'testaaa2024', 'password' => '123', 'gender' => '女', 'email' => 'huiye@163.com', 'price' => 90, 'details' => '123' ];
        $data2 = [ 'idss'=>303,'username' => 'testaaa2024', 'password' => '123', 'gender' => '女', 'email' => 'huiye@163.com', 'price' => 90, 'details' => '123' ];
//        Db::name('user')->insert($data);
//        Db::name('user')->replace()->insert($data);//主键重复则更新数据
//        return Db::name('user')->insertGetId($data);
//        Db::name('user')->strict(false)->insertGetId($data2);//忽略异常
        return 'ok';
    }

    public function batchAdd()
    {
        $data = [
            [
                'id'=>'303','username' => 'ahahahah', 'password' => '123', 'gender' => '女', 'email' => 'huiye@163.com', 'price' => 90, 'details' => '123'
            ],
            [
                'id'=>'304','username' => 'haahkalal', 'password' => '123', 'gender' => '女', 'email' => 'huiye@163.com', 'price' => 90, 'details' => '123'
            ]
        ];
        try {
            Db::name('user')->replace()->insertAll($data);//主键重复则更新数据
        }catch (\Exception $exception){
            return $exception->getMessage();
        }
        return 'ok';
    }

数据库的修改删除

update 、 save

如果想让一些字段修改时执行 SQL 函数操作,可以使用 exp()方法实现。

Db::name('user')->where('id', 232) ->exp('email', 'UPPER(email)') ->update();

如果要自增/自减某个字段,可以使用 inc/dec 方法,并支持自定义步长

Db::name('user')->where('id', 232) ->inc('price') ->dec('status', 2) ->update();

一个更加简单粗暴灵活的方式,使用::raw()方法实现自增自减等函数操作的内容

Db::name('user')
    ->where('id',232)
    ->update(['email'=>Db::raw('UPPER(email)'),'price'=>Db::raw('price+1'),'status'=>Db::raw('status - 2')]);

数据删除

  1. 极简删除可以根据主键直接删除,删除成功返回影响行数,否则 0; Db::name('user')->delete(51);
  2. 根据主键,还可以删除多条记录; Db::name('user')->delete([48,49,50]);
  3. 正常情况下,通过 where()方法来删除; Db::name('user')->where('id', 47)->delete();
  4. 通过 true 参数删除数据表所有数据,我还没测试,大家自行测试下; Db::name('user')->delete(true);

3.数据库的查询表达式

public function queryExpression()
{
    //比较查询
    Db::name('user')->where('id',80)->find();
    Db::name('user')->where('id','=',80)->find();
    Db::name('user')->where('id','>=<=',80)->find();

    //区间查询 都是可以逗号隔开或者数组 like between in
    Db::name('user')->where('email','like',['xiao%','xiao2%'])->select();
    Db::name('user')->where('email','not like','xiao%')->select();
    Db::name('user')->whereLike('email','xiao%')->select();
    Db::name('user')->whereNotLike('email','xiao%')->select();
    Db::name('user')->whereBetween('id','in',[19,20,21])->select();
    Db::name('user')->whereBetween('id','in',[19,20,21])->select();
    Db::name('user')->where('id','in','19,20,21')->select();
    Db::name('user')->whereBetween('id','not in',[19,20,21])->select();
    Db::name('user')->where('id','in',[19,20,21])->select();
    Db::name('user')->whereNotIn('id','in',[19,20,21])->select();

    //null 表达式具有两个快捷方式 whereNull()和 whereNotNull();
    Db::name('user')->where('uid','null')->select();
    Db::name('user')->where('uid','not null')->select();
    Db::name('user')->whereNull('uid')->select();
    Db::name('user')->whereNotNull('uid')->select();
    

    //EXP 查询 1. 使用 exp 可以自定义字段后的 SQL 语句;
    Db::name('user')->where('id','exp','IN (19,21,25)')->select();
    Db::name('user')->whereExp('id','IN (19,21,25)')->select();
}