Laravle 模型全局作用域

Laravle 模型全局作用域

就是给每次的查询获取sql,添加固定的过滤条件。主要,需要给添加的字段添加表前缀。使用模型的公有方法getTable方法获取表名

1. 定义全局作用域

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;

class FilterDeleteScope extends Scope
{
	public function apply(Builder $builder, Model $model)
	{
		// 使用$model->getTable()获取表名
		$builder->where($model->getTable().'.is_delete', '=', 1);
	}
}

2. 注册全局作用域

尽量让某些固有的表字段名称统一,比如是否删除的字段,等。这样就可以使用统一的方式处理。

比如1中提到的对is_delete字段定义了模型全局作用域,假设is_delete每张表都有的话,那么我们可以再次重写模型类。让表的模型继承重写的基类

/**
 * 重写模型基类
 */	

use Illuminate\Database\Eloquent\Model;
// 根据具体的空间作用域引入FilterDeleteScope
use FilterDeleteScop;

class BaseModel extends Model
{
	protected static function booted()
	{
		// 调用父类的方法
		parent::booted();
		
		// 添加全局作用域
		static::addGlobalScope(new FilterDeleteScope);
		// ... 其他的全局作用域
	}
}


class User extends BaseModel
{
 	// 这样使用,User模型查询时,就自带过滤is_delete条件了
}

3. 查询时取消全局作用域

  1. 取消所有的全局作用域

    $userBuilder = User::withoutGlobalScopes();
    // 然后使用$userBilder进行下面的查询逻辑,当然也可以在一行写完所有的
    
  2. 取消部分全局作用域

    $userBuilder = User::withoutGlobalScopes([FilterDeleteScpoe::class, ...]);
     // 然后使用$userBilder进行下面的查询逻辑,当然也可以在一行写完所有的
     // 如果只取消一个的话,则不需要[]
    

4. 其他

其他的方式参考官方文档即可,比如闭包的方式,动态方式等

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值