thinkphp6查询范围scope探索

定义全局scope

在文章模型中

    // 定义全局的查询范围
    protected $globalScope = [‘status‘];

    public function scopeStatus($query)
    {
        $query->whereIN(‘status‘, [
            1,
            2
        ]);
    }

定义全局范围后对更新数据产生的影响

查询数据都很正常,但是如果对于更新就会有很大影响

        //id = 17 这条数据是存在数据库的,但是status字段的数据不满足全局 Scope 里面的条件
        //返回null
        //$article = \app\model\Article::find(17);


        //查询,排除特定scope 能查询到
        //$article = \app\model\Article::withoutGlobalScope([‘status‘])->find(17);


        //直接更新

        //方式一:该更新可以和withoutGlobalScope()一起使用,不会自动更新时间戳字段(不太推荐)
//        $res = \app\model\Article::withoutGlobalScope(["status"])->update([
//            ‘title‘ => ‘thinkphp222‘,
//            ‘id‘    => 17
//        ]);

        //这个写法,可以把查询条件写外边。
//        $res = \app\model\Article::withoutGlobalScope(["status"])->where(‘id‘,17)->update([
//            ‘title‘ => ‘thinkphp3333‘
//        ]);


        //方式二:该方式可以更新 update_time 时间戳字段(推荐,但是该方式不支持和withoutGlobalScope()方式一起使用)
//        $res = \app\model\Article::update([‘title‘ => ‘title2222‘], [‘id‘ => 19]);



        //查询并更新(这种更新方式,虽说可以查询,但是对于GlobalScope 约束的 数据 无法更新)
        $article = \app\model\Article::withoutGlobalScope()->find(17);

        $article->title = ‘www123‘;
        $article->save();


总结

GlobalScope一般情况下,不要使用它。要使用也要使用非全局的scope,比较灵活,用非全局的scope,进行简单封装即可

thinkphp6查询范围scope探索

上一篇:EcShop之路-Smarty


下一篇:【免费程序】Creative主题电子科技企业类模板/Discuz科技企业网站模板