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

一.本地作用域

  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([])方法,传递参数取消多个全局;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

App接口如何保证安全

微信开发或者高德地图,百度地图什么的api要使用,使用之前都需要注册一个账号,然后系统会给你一个key,然后调用api的时候把key传给服务器。 平常公司内部开发项目时,直接用mvc为app客户端提供接口,没有做过验…

论文阅读 - Joint Beat and Downbeat Tracking with Recurrent Neural Networks

文章目录1 概述2 信号预处理3 分类神经网络4 动态贝叶斯网络(HMM)4.1 原始的bar pointer model4.2 原始的bar pointer model的缺点4.3 改进后的模型5 预测参考资料1 概述 最近在做音乐卡点相关的项目,需要对音乐的基本特征进行理解&#xff…

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

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

python将txt转json_Python控制乐高EV3,以及VSCODE环境配置

乐高EV3的可扩展性很强,但如何用pc连接ev3,并用python代码来控制EV3,资料太少了,试着做了一次,记录在这里。需要的硬/软件硬件准备一、乐高EV3二、PC,win10系统三、TF卡(我用的是64G的&#xff…

移动文件读/写指针----lseek

头文件&#xff1a;#include<sys/types.h>、#include<unistd.h> 函数原型&#xff1a;off_t lseek(int fildes,off_t offset,int whence) 参数说明&#xff1a;fildes:文件描述符 offset:偏移量&#xff0c;正数表示正向偏移&#xff0c;负数表示负向偏移。 whence…

Yolo系列知识点梳理(Yolov1-v5)

文章目录1 概述2 Yolo系列模型2.1 基石 - Yolov12.1.1 Yolov1的网络结构2.1.2 Yolov1的feature map2.1.3 Yolov1的训练2.1.4 Yolov1的预测2.1.5 Yolov1小结2.2 Yolo9000 - Yolov22.2.1 Better2.2.1.1 引入了Batch normalization2.2.1.2 高分辨率的分类器2.2.1.3 加入了anchor机…

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

一&#xff0e;创建集合 什么是集合&#xff1f;即&#xff1a;它是一种更具读取性和处理能力的数组封装&#xff1b;比如&#xff0c;我们从数据库得到的数据列表&#xff0c;它就是一种集合&#xff1b;数据集合&#xff0c;提供了大量的方法方便我们进行各种操作&#xff1…

神经网络用python还是matlab_Matlab与神经网络学习笔记

这是学习《Neural Network and Deep Learning》的笔记。在刚开始学习时&#xff0c;电脑安装的是python3&#xff0c;而作者用的是2.我想着反正要熟悉代码&#xff0c;大学期间MATLAB用的比较多&#xff0c;也懒得去折腾python2或是重写成python3.于是用MATLAB完成了里面的实例…

二十三、PHP框架Laravel学习笔记——集合的常用方法

一&#xff0e;常用方法 all()方法&#xff0c;转换为属性形式输出&#xff0c;使用 dd 方法看类型&#xff1b; $collection collect([1, 2, 2, 3, 4, 4, 4]); dd($collection->all()); PS&#xff1a;$collection->dd()方法可以以 dd()模式输出&#xff0c;还有 du…

mac看图软件哪个好用_细数Mac上那些好用且免费的软件(三)

许多朋友购买了Mac电脑之后发现很多软件都没有&#xff0c;而且苹果商店好多软件都是收费的。那有没有免费的软件也能满足日常的需求呢&#xff1f;macw小编就为大家推荐一些免费且超级好用的软件&#xff0c;赶快来看看有没有你需要的吧&#xff01;细数Mac上那些好用且免费的…

图像表格实线和虚线检测

文章目录1 背景简述2 camelot中的方法2.1 二值化2.2 腐蚀膨胀2.3 轮廓检测2.4 结果展示3 基于霍夫直线检测的方法3.1 霍夫直线检测原理3.2 概率霍夫直线检测3.3 霍夫直线应用参考资料1 背景简述 图像中的表格结构化是一个比较热门的话题&#xff0c;其输入是一张图片&#xff…

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

一&#xff0e;数据集合 数据集合&#xff0c;就是已经将模型方法 get()获取到的数据再进行处理&#xff1b;比如&#xff1a;map()方法&#xff0c;通过它可以实现类似访问器一样对字段进行处理的效果&#xff1b; $users User::get(); //使用集合方法 map 可以对输出的字…

const参数,const返回值与const函数

在C程序中&#xff0c;经常用const 来限制对一个对象的操作&#xff0c;例如&#xff0c;将一个变量定义为const 的&#xff1a; const int n3; 则这个变量的值不能被修改&#xff0c;即不能对变量赋值。 const 这个关键字经常出现在函数的定义中&#xff0c;而且会出现在不同…

python简笔画怎么画_怎样用tk语句在Python下画一棵树

展开全部 1.代码的结2113构&#xff1a; 本代码有两个子5261函数组成&#xff0c;据图有main函数4102和画树函数组成。 2.编写画1653树函数&#xff1a; 画树函数&#xff0c;就是用来画出我们的树的一种子函数&#xff0c;代码如下&#xff1a;def tree(plist,l,a,f): if l>…

论文阅读 - AUTOVC: Zero-Shot Voice Style Transfer with Only Autoencoder Loss

文章目录1 概述2 模型架构3 模块解析3.1 获取梅尔频谱3.2 speaker encoder3.3 AutoVC3.4 Vocoder4 关键部分参考资料1 概述 voice conversion这个任务的目标是输入两个音频&#xff0c;其输入是两段音频&#xff0c;一段音频称为content_audio&#xff0c;另一段称为speaker_a…

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

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

linux-0.11内核 调试教程+GCC源代码

http://pan.baidu.com/share/home?uk453348606&viewshare#category/type0 http://blog.csdn.net/oldlinux/article/details/42558445转载于:https://www.cnblogs.com/zengkefu/p/5563351.html

python 私有属性_Python3伪私有属性

1&#xff1a;伪私有属性介绍 在Python中一切都是对象&#xff0c;并且类的所有属性和方法都是公有的(public)&#xff0c;并不存在private 关键字来声明私有方法或属性。那么在Python中怎么实现像其他编程语言一样的私有属性呢&#xff1f;其实只需在属性前加上双下划线(但是结…

小工具:基于颜色的视频和图片切割

文章目录1 前言2 方案简述3 效果1 前言 最近做一个短视频相关的项目的时候&#xff0c;发现输入的视频有很多是有黑边的&#xff0c;有些可能是白边或者其他颜色的边。这对下游的模型处理有很大的影响。于是就写了一个自动判断填充边的颜色&#xff0c;并根据该颜色自动切割视…

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

二&#xff0e;一对多关联 一对多关联&#xff0c;本质上使用方法和一对一关联类似&#xff0c;内部实现略有不同&#xff1b; 创建另一个模型&#xff1a;book.php&#xff0c;我们看下这个表数据&#xff1b; PS&#xff1a;这里 user_id19 有三个&#xff0c;也就是蜡笔小…