一.本地作用域

  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();

  1. 上面的方法比较死板,适合简单粗暴,如果想要灵活多变,支持传递参数;
//参数可以是 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
{public function apply(Builder $builder, Model $model){// TODO: Implement apply() method.$builder->where('status',1);}
}
  1. 此时,还不能实现全局,因为需要在模型设置个开关,让其富有灵活性;
//启用全局作用域
protected static function booted() {
parent::booted(); // TODO: Change the autogenerated stub
static::addGlobalScope(new StatusScope());
}

PS:而在控制器端,并不需要做任何设置,即可自动添加 status=1 的条件;

  1. 当然,如果这个全局只是针对某个模块,并不需要创建一个全局类,直接闭包即可;
static::addGlobalScope('status', function (Builder $builder) { return $builder->where('status', 1);
});



PS:注意 Builder 引入的文件和全局类引入的文件一致,如果引入别的同名类会错;

  1. 如果某个查询,并不需要这个全局条件,可以单独移出掉;
//取消名称为 status 的全局
$users = User::withoutGlobalScope('status')->get(); //取消全局类的条件
$users = User::withoutGlobalScope(StatusScope::class)->get();


PS:还有 withoutGlobalScopes([])方法,传递参数取消多个全局;

二十、PHP框架Laravel学习笔记——模型的作用域相关推荐

  1. 二十八、PHP框架Laravel学习笔记——模型的关联查询

    二.关联查询 前几篇博文,了解了三种基础的关联模型,并简单的进行查询: 本节课,我们详细的了解更多的查询方案: //下面两种查询是一样的: $books = User::find(19)->bo ...

  2. 二十六、PHP框架Laravel学习笔记——模型的一对多关联

    二.一对多关联 一对多关联,本质上使用方法和一对一关联类似,内部实现略有不同: 创建另一个模型:book.php,我们看下这个表数据: PS:这里 user_id=19 有三个,也就是蜡笔小新有三本书 ...

  3. 二十五、PHP框架Laravel学习笔记——模型的一对一关联

    一.关联概念 关联模型,即:两张或以上的表进行一定规则的绑定关联: 比如:一个学生(学生表)对应一张个人信息卡(信息表),这种就是一对一: 再比如:一篇博文(帖子表)对应多个评论(评论表),这种就是一 ...

  4. 二十四、PHP框架Laravel学习笔记——模型的数据集合

    一.数据集合 数据集合,就是已经将模型方法 get()获取到的数据再进行处理: 比如:map()方法,通过它可以实现类似访问器一样对字段进行处理的效果: $users = User::get(); / ...

  5. 三十、PHP框架Laravel学习笔记——模型的预加载

    一.预加载 预加载,就是解决关联查询中产生的 N+1 次查询带来的资源消耗 我们要获取所有书籍的作者(或拥有者),普通查询方案如下: //获取所有书籍列表 $books = Book::all(); ...

  6. 二十七、PHP框架Laravel学习笔记——模型的多对多关联

    二.多对多关联 多对多关联,比前面两种要复杂一些,需要一张中间表,共三张: (1) .users:用户表: (2) .roles:权限表: (3) .role_user:中间表:默认表名,user_i ...

  7. 二十二、PHP框架Laravel学习笔记——集合的使用

    一.创建集合 什么是集合?即:它是一种更具读取性和处理能力的数组封装: 比如,我们从数据库得到的数据列表,它就是一种集合: 数据集合,提供了大量的方法方便我们进行各种操作: 除了数据库对象返回的数据集 ...

  8. 二十一、PHP框架Laravel学习笔记——模型的访问器和修改器

    一.访问器 访问器:就是在获取数据列表时,拦截属性并对属性进行修改的过程: 比如,我们在输出性别时,在性别左右加上括号,或给邮件转换为大写: //访问器,前固定 get,后固定 Attribute,G ...

  9. 十八、PHP框架Laravel学习笔记——模型的增删改

    一.增删改操作 新增方法如下,注意:默认模型接管 created_at 和 updated_at: $users = new User(); $users->username = '辉夜'; $ ...

最新文章

  1. linux中cat more less head tail 命令区别
  2. 巧用词语角色:基于目标自适应图的跨目标立场检测
  3. 自动生成 指定范围日期 生成字符串格式时间日期 --计算连续时间 SQL
  4. VHDL常用操作符介绍
  5. c#位数不够0补充完_Java与C#比较,哪个语言更是适合你?
  6. 13penrose广义逆矩阵(I)
  7. ActiveMQ(一)——JMS、应用场景、关键对象、demo
  8. Crystal Ball—蒙地卡罗仿真软件
  9. SQL server 创建数据库代码,非常详细
  10. Linux开发环境——SSH工具
  11. 多个域名指向一个ip
  12. 这么清晰的帮助手册,AppCube 二次体验
  13. myd文件 php项目,MYSQL表引擎与文件.frm,.myd,.myi
  14. SpringCloud:统一网关Gateway
  15. 转:mbedtls学习3.mbedtls_API分析
  16. Linux应用开发【第十二章】I2C编程应用开发
  17. 优酷1080P的KUX视频如何快速转换成MP4格式 1
  18. 三维数字虚拟GIS沙盘教程第30课:电子地图数据来源分析
  19. 冰点与沸点—— 我的购物记
  20. 《中国棒球》:国家女子棒球队·一棒成名

热门文章

  1. 计算机一级发邮件发送多个抄送,计算机一级考试IE题和收发邮件模拟题.docx
  2. java 加锁_Java并发之synchronized深入
  3. loading gif 透明_搞笑GIF:有这样的女朋友下班哪里都不想去
  4. 闭包---在函数内部再定义一个函数
  5. 计算机科学和建筑设计结合,智能化建筑中计算机科学与技术的应用
  6. mysql raid_DBA们应该知道的RAID卡知识_MySQL
  7. dedecms php5.4 无法退出后台,PHP5.4版本织梦dedecms后台退出空白的解决方法
  8. mysql5.7物理备份_Mysql5.7—运维常用备份方式
  9. 企业的网站遭受木马攻击了,导致网站目录下所有文件都被篡改了
  10. jQuery 获取页面元素的属性值