答案:ThinkPHP的查询作用域通过定义scope方法封装常用查询条件,支持无参、带参及默认全局作用域,可组合调用或链式使用,有效减少重复代码,提升模型可维护性。

ThinkPHP 的查询作用域(scope)是一种封装常用查询条件的方式,能有效减少重复代码,提升模型的可维护性。通过定义作用域,你可以把经常用到的查询逻辑集中管理,在需要时直接调用。
在模型类中通过 scope 开头的方法定义作用域。方法接收查询对象作为参数,可链式调用。
例如,用户模型中常见的“只查启用状态”和“按创建时间排序”:
class User extends Model
{
// 定义作用域:启用状态
public function scopeActive($query)
{
$query->where('status', 1);
}
// 定义作用域:按创建时间倒序
public function scopeLatest($query)
{
$query->order('create_time', 'DESC');
}
}
定义后,可通过 使用 scope 方法调用多个作用域,组合出完整查询。
立即学习“PHP免费学习笔记(深入)”;
// 调用多个作用域
User::scope('active,latest')->select();
// 等同于
User::where('status', 1)->order('create_time', 'DESC')->select();
也可以直接链式调用作用域方法(需开启动态调用):
User::active()->latest()->select();
作用域支持传参,适用于动态条件。
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();
如果希望某个条件每次查询都自动加上,可定义默认作用域。
public static function base($query)
{
$query->where('is_delete', 0); // 假设软删除字段
}
这样,所有对该模型的查询都会自动过滤掉已删除数据。
基本上就这些。合理使用作用域能让代码更清晰,避免到处写重复的 where 条件,尤其适合权限、状态、租户等通用筛选场景。
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号