首页 > php框架 > ThinkPHP > 正文

thinkphp查询作用域(scope)如何简化查询

冰火之心
发布: 2025-09-29 23:26:03
原创
532人浏览过
答案:ThinkPHP的查询作用域通过定义scope方法封装常用查询条件,支持无参、带参及默认全局作用域,可组合调用或链式使用,有效减少重复代码,提升模型可维护性。

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. 带参数的作用域

作用域支持传参,适用于动态条件。

蓝心千询
蓝心千询

蓝心千询是vivo推出的一个多功能AI智能助手

蓝心千询34
查看详情 蓝心千询
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 条件,尤其适合权限、状态、租户等通用筛选场景。

以上就是thinkphp查询作用域(scope)如何简化查询的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号