答案:Thinkphp的查询作用域通过定义scope方法封装常用查询条件,支持无参、带参及默认全局作用域,可组合调用或链式使用,有效减少重复代码,提升模型可维护性。
thinkphp 的查询作用域(scope)是一种封装常用查询条件的方式,能有效减少重复代码,提升模型的可维护性。通过定义作用域,你可以把经常用到的查询逻辑集中管理,在需要时直接调用。
1. 定义查询作用域
在模型类中通过 scope 开头的方法定义作用域。方法接收查询对象作为参数,可链式调用。
例如,用户模型中常见的“只查启用状态”和“按创建时间排序”:
class User extends Model { // 定义作用域:启用状态 public function scopeActive($query) { $query->where('status', 1); } // 定义作用域:按创建时间倒序 public function scopeLatest($query) { $query->order('create_time', 'DESC'); } }
2. 使用作用域简化查询
定义后,可通过 使用 scope 方法调用多个作用域,组合出完整查询。
立即学习“PHP免费学习笔记(深入)”;
// 调用多个作用域 User::scope('active,latest')->select(); // 等同于 User::where('status', 1)->order('create_time', 'DESC')->select();
也可以直接链式调用作用域方法(需开启动态调用):
User::active()->latest()->select();
3. 带参数的作用域
作用域支持传参,适用于动态条件。
public function scopeType($query, $type) { $query->where('type', $type); } public function scopeKeyword($query, $keyword) { $query->where('name', 'like', "%{$keyword}%"); }
调用方式:
User::scope('type:1,keyword:张')->select(); // 或 User::type(1)->keyword('张')->select();
4. 默认作用域(全局作用域)
如果希望某个条件每次查询都自动加上,可定义默认作用域。
public static function base($query) { $query->where('is_delete', 0); // 假设软删除字段 }
这样,所有对该模型的查询都会自动过滤掉已删除数据。
基本上就这些。合理使用作用域能让代码更清晰,避免到处写重复的 where 条件,尤其适合权限、状态、租户等通用筛选场景。