ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
> ## 查询范围:把基础的查询条件封装成一个整体,在其他查询中可以直接调用这个条件整体进行查询 > 可以理解为把一串的链式操作定义为一个函数,查询的时候直接利用链式进行调用 ### 查询范围定义 ``` class User extends Model { // 定义名为thinkphp的查询范围 protected function scopeThinkphp($query) { $query->where('name','thinkphp')->field('id,name'); } // 定义名为age的查询范围 protected function scopeAge($query) { $query->where('age','>',20)->limit(10); } } ``` ### 查询范围的调用 ``` // 查找name为thinkphp的用户(基于thinkphp查询范围) User::scope('thinkphp')->find(); // 查找年龄大于20的10个用户(基于age查询范围) User::scope('age')->select(); // 查找name为thinkphp的用户并且年龄大于20的10个用户(基于thinkphp和age查询范围) User::scope('thinkphp,age')->select(); // 也可以直接使用闭包函数(这种用法没意义) User::scope(function($query){ $query->where('age','>',20)->limit(10); })->select(); // 动态调用(注意:查询范围必须在所有链式操作最前面调用,且后面必须为find或者select) $user = new User; // 查找name为thinkphp的用户 (基于thinkphp查询范围) $user->thinkphp()->get(); // 查找年龄大于20的10个用户 (基于age查询范围) $user->age()->all(); // 查找name为thinkphp的用户并且年龄大于20的10个用户 (基于thinkphp和age查询范围) $user->thinkphp()->age()->all(); ``` ### 传入参数的查询范围 ``` // 定义方法 class User extends Model { protected function scopeAgeAbove($query, $lowest_age) { $query->where('age','>',$lowest_age)->limit(10); } } // 调用方法(必须为驼峰调用,不能为age_above) User::scope('ageAbove', 20)->select(); ``` ### 全局查询范围(模型中所有查询操作都会自动调用这个查询范围) **全局查询范围方法在5.0.2版本之前必须定义为static静态方法** ``` class User extends Model { // 定义全局的查询范围 protected function base($query) { $query->where('status',1); } } // 动态开关全局查询范围 // 关闭全局查询范围 User::useGlobalScope(false)->get(1); // 开启全局查询范围 User::useGlobalScope(true)->get(2); ```