定义全局scope
在文章模型中
// 定义全局的查询范围
protected $globalScope = [‘status‘];
public function scopeStatus($query)
{
$query->whereIN(‘status‘, [
1,
2
]);
}
定义全局范围后对更新数据产生的影响
查询数据都很正常,但是如果对于更新就会有很大影响
//id = 17 这条数据是存在数据库的,但是status字段的数据不满足全局 Scope 里面的条件
//返回null
//$article = \app\model\Article::find(17);
//查询,排除特定scope 能查询到
//$article = \app\model\Article::withoutGlobalScope([‘status‘])->find(17);
//直接更新
//方式一:该更新可以和withoutGlobalScope()一起使用,不会自动更新时间戳字段(不太推荐)
// $res = \app\model\Article::withoutGlobalScope(["status"])->update([
// ‘title‘ => ‘thinkphp222‘,
// ‘id‘ => 17
// ]);
//这个写法,可以把查询条件写外边。
// $res = \app\model\Article::withoutGlobalScope(["status"])->where(‘id‘,17)->update([
// ‘title‘ => ‘thinkphp3333‘
// ]);
//方式二:该方式可以更新 update_time 时间戳字段(推荐,但是该方式不支持和withoutGlobalScope()方式一起使用)
// $res = \app\model\Article::update([‘title‘ => ‘title2222‘], [‘id‘ => 19]);
//查询并更新(这种更新方式,虽说可以查询,但是对于GlobalScope 约束的 数据 无法更新)
$article = \app\model\Article::withoutGlobalScope()->find(17);
$article->title = ‘www123‘;
$article->save();
总结
GlobalScope一般情况下,不要使用它。要使用也要使用非全局的scope,比较灵活,用非全局的scope,进行简单封装即可