20.模型的作用域

news/2025/2/1 19:43:14/

学习要点:
1.本地作用域
2.全局作用域
本节课我们来开始学习数据库模型的本地作用域和全局作用域的设置方法。
一.本地作用域
1. 很多情况下,我们在数据查找时有一部分条件会被重复且大量使用;
2. 而这个条件,可能只是在这个模型对应的数据表使用,别的表并不使用;
3. 那么这种情况,可以使用本地作用域的方式,将常用的 SQL 封装起来;
4. 比如:用户模块中,我们大量查询需要查询性别为男,且其它条件的 SQL;
$users = User::where('gender', '男')
->where('price', '>', 90)
->get();
PS:我们可以将性别为男这个片段,封装成一个单独的方法,然后统一在这个模型下调用;
//App\Http\Models;
//本地作用域,搜索自动添加为“男”的条件
//语法:scope 开头,后面名称尽可能包含语义
public function scopeGenderMale($query)
{
return $query->where('gender', '男');
}
//当然,如果赶紧单词太长,直接 gm()也行
$users = User::genderMale()
->where('price', '>', 90)
->get();
5. 上面的方法比较死板,适合简单粗暴,如果想要灵活多变,支持传递参数;
//参数可以是 1 个或多个
$users = User::gender('女', -3)
->where('price', '>', 90)
->get();
//参数 2 和 3,接受控制器传递过来的 1,2
public function scopeGender($query, $value, $value2)
{
return $query->where('gender', $value)->where('status', $value2);
}【十天精品课堂系列】 主讲:李炎恢
二.全局作用域
1. 全局作用域,顾名思义就是在任意地方都可以有效的封装条件;
2. 比如有个需求,不管在哪里操作,总是显示 status 为 1 的用户;
3. 首先在 app 目录下创建一个用于全局作用域的目录:Scopes;
4. 创建一个用于设置 status 为 1 的全局作用域的类,它需要实现 scope 接口;

namespace App\Scopes;
//这里引用代码自动生成
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class StatusScope implements Scope
{
/**
* @inheritDoc
*/
public function apply(Builder $builder, Model $model)
{
// TODO: Implement apply() method.
return $builder->where('status', 1);
}
}


5. 此时,还不能实现全局,因为需要在模型设置个开关,让其富有灵活性;
//启用全局作用域
protected static function booted()
{
parent::booted(); // TODO: Change the autogenerated stub
static::addGlobalScope(new StatusScope());
}
PS:而在控制器端,并不需要做任何设置,即可自动添加 status=1 的条件;
6. 当然,如果这个全局只是针对某个模块,并不需要创建一个全局类,直接闭包即可;
static::addGlobalScope('status', function (Builder $builder) {
return $builder->where('status', 1);
});
PS:注意 Builder 引入的文件和全局类引入的文件一致,如果引入别的同名类会错;
7. 如果某个查询,并不需要这个全局条件,可以单独移出掉;
//取消名称为 status 的全局
$users = User::withoutGlobalScope('status')->get();
//取消全局类的条件
$users = User::withoutGlobalScope(StatusScope::class)->get();
PS:还有 withoutGlobalScopes([])方法,传递参数取消多个全局


http://www.ppmy.cn/news/70059.html

相关文章

Windows上配置访问共享

Windows上配置访问共享 方法一:FTP共享方法二:文件共享 方法一:FTP共享 参考该链接:https://blog.csdn.net/qq_41101213/article/details/94214121 方法二:文件共享 本案例是在windows防火墙开启的状态下配置的 给本…

InsCode体验报告

文章目录 前言一、InsCode是什么?二、体验过程1.创建项目2.在线IDE3.运行和部署项目4.浏览和学习项目5.分享和协作项目6.支持AI助手 三、体验感受优点缺点 总结 官方宣传视频 InsCode-AI 前言 作为一个大三计算机专业的学生,我对编程有着浓厚的兴趣和热…

mapreduce优化方法

1)数据输入: 1)合并小文件:在执行mr任务前将小文件进行合并,大量的小文件会产生大量的map任务,增大map任务装载次数,而 任务的装载比较耗时,从而导致 mr 运行较慢。 2)…

Spring Boot异常处理

目录 Spring Boot异常处理 介绍 拦截器VS 过滤器 自定义异常页面 自定义异常页面 代码实战 需求 代码实现 创建MyErrorController类来模拟异常错误 完成测试 全局异常 说明 全局异常-应用实例 创建GlobalExceptionHandler.java 创建对应的视图地址global.html 完成…

【MySQL】浅谈事务

哈喽,大家好~我是你们的老朋友:保护小周ღ 谈起 “事务”,可能大家都会在心中出现一个大大的 ?,博主的理解——事务就是解决 MySql数据库在应对多线程环境下针对同一存储空间的数据修改引起的数据安全问题的一种机制…

【人工智能】— 贝叶斯网络、概率图模型、全局语义、因果链、朴素贝叶斯模型、枚举推理、变量消元

【人工智能】— 贝叶斯网络 频率学派 vs. 贝叶斯学派贝叶斯学派Probability(概率):独立性/条件独立性:Probability Theory(概率论):Graphical models (概率图模型)什么是图模型(Grap…

【开发者指南】如何在MyEclipse中使用HTML或JSP设计器?(上)

MyEclipse v2022.1.0正式版下载 一、HTML & JSP 可视化设计器 本文简要介绍了 MyEclipse HTML 和 JSP Web 设计器的概念、功能和基本操作过程。这两个设计器具有相似的功能和相同的操作模型,但本文为专门针对其类型的内容。本文档中的示例是使用 MyEclipse HT…

“虐人的”双亲委派机制

这些问题,看看你能回答上来多少个: 1、什么是双亲委派? 2、为什么需要双亲委派,不委派有什么问题? 3、”父加载器”和”子加载器”之间的关系是继承的吗? 4、双亲委派是怎么实现的? 5、我能不能…