网站购买平台,普陀区网站建设,设计公司 网站,昆明百度seo一#xff0e;本地作用域
很多情况下#xff0c;我们在数据查找时有一部分条件会被重复且大量使用#xff1b;而这个条件#xff0c;可能只是在这个模型对应的数据表使用#xff0c;别的表并不使用#xff1b;那么这种情况#xff0c;可以使用本地作用域的方式#xf…一本地作用域
很多情况下我们在数据查找时有一部分条件会被重复且大量使用而这个条件可能只是在这个模型对应的数据表使用别的表并不使用那么这种情况可以使用本地作用域的方式将常用的 SQL 封装起来比如用户模块中我们大量查询需要查询性别为男且其它条件的 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 个或多个
$users User::gender(女, -3) -where(price, , 90) -get();
//参数 2 和 3接受控制器传递过来的 12
public function scopeGender($query, $value, $value2) {
return $query-where(gender, $value)-where(status, $value2);二全局作用域 全局作用域顾名思义就是在任意地方都可以有效的封装条件 比如有个需求不管在哪里操作总是显示 status 为 1 的用户 首先在 app 目录下创建一个用于全局作用域的目录Scopes 创建一个用于设置 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);}
}此时还不能实现全局因为需要在模型设置个开关让其富有灵活性
//启用全局作用域
protected static function booted() {
parent::booted(); // TODO: Change the autogenerated stub
static::addGlobalScope(new StatusScope());
}PS而在控制器端并不需要做任何设置即可自动添加 status1 的条件
当然如果这个全局只是针对某个模块并不需要创建一个全局类直接闭包即可
static::addGlobalScope(status, function (Builder $builder) { return $builder-where(status, 1);
}); PS注意 Builder 引入的文件和全局类引入的文件一致如果引入别的同名类会错
如果某个查询并不需要这个全局条件可以单独移出掉
//取消名称为 status 的全局
$users User::withoutGlobalScope(status)-get(); //取消全局类的条件
$users User::withoutGlobalScope(StatusScope::class)-get(); PS还有 withoutGlobalScopes([])方法传递参数取消多个全局