Laravel5.7 Eloquent ORM快速入门详解(8)

应用全局作用域

要将全局作用域应用到模型,需要重写给定模型的 boot 方法并使用 addGlobalScope 方法:

<?php

namespace App;

use App\Scopes\AgeScope;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
 /**
  * 模型的“启动”方法.
  *
  * @return void
  */
 protected static function boot()
 {
  parent::boot();

  static::addGlobalScope(new AgeScope);
 }
}

添加作用域后,如果使用 User::all() 查询则会生成如下 SQL 语句:

select * from `users` where `age` > 200

匿名的全局作用域

Eloquent 还允许我们使用闭包定义全局作用域,这在实现简单作用域的时候特别有用,这样的话,我们就没必要定义一个单独的类了:

<?php

namespace App;

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

class User extends Model{
 /**
  * The "booting" method of the model.
  *
  * @return void
  */
 protected static function boot()
 {
  parent::boot();

  static::addGlobalScope('age', function(Builder $builder) {
   $builder->where('age', '>', 200);
  });
 }
}

移除全局作用域

如果想要在给定查询中移除指定全局作用域,可以使用 withoutGlobalScope 方法,该方法接收全局作用域的类名作为其唯一参数:

User::withoutGlobalScope(AgeScope::class)->get();

或者,如果你使用闭包定义的全局作用域的话:

User::withoutGlobalScope('age')->get();

如果你想要移除某几个或全部全局作用域,可以使用 withoutGlobalScopes 方法:

// 移除所有全局作用域
User::withoutGlobalScopes()->get();

 //移除某些全局作用域 
 User::withoutGlobalScopes([FirstScope::class, SecondScope::class])->get();

本地作用域

本地作用域允许我们定义通用的约束集合以便在应用中复用。例如,你可能经常需要获取最受欢迎的用户,要定义这样的一个作用域,只需简单在对应 Eloquent 模型方法前加上一个 scope 前缀。

作用域总是返回查询构建器实例:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
 /**
  * 只包含活跃用户的查询作用域
  *
  * @return \Illuminate\Database\Eloquent\Builder
  */
 public function scopePopular($query)
 {
  return $query->where('votes', '>', 100);
 }

 /**
  * 只包含激活用户的查询作用域
  *
  * @return \Illuminate\Database\Eloquent\Builder
  */
 public function scopeActive($query)
 {
  return $query->where('active', 1);
 }
}


      

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/5967.html