您的位置:首页 > 编程语言 > PHP开发

laravel--6 eloquent查询作用域

2017-06-20 18:02 281 查看
理解:查询作用域就是
给查询添加条件
where
语句中自动添加一些条件限制

全局作用域:添加作用域后如果使用
PhotoModel::all() PhotoModel::get()
则会在SQL语句中增加条件限制

本地作用域:给Model类中的方法
where条件限制


全局作用域

首先定义一个实现
Illuminate\Database\Eloquent\Scope
接口的类,该接口需要实现
apply
方法

eg:

<?php
namespace App\Scopes;
use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class AgeScope implements Scope{
public function apply(Builder $builder, Model $model) {
return $builder->where('age', '>', 200);
}
}


应用全局作用域(要将全局作用域分配给模型,需要重写给定模型的 boot 方法并使用 addGlobalScope 方法)

<?php
namespace App;
use App\Scopes\AgeScope;
use Illuminate\Database\Eloquent\Model;

class User extends Model{
protected static function boot(){
parent::boot();
static::addGlobalScope(new AgeScope);
}
}


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

select * from
users
where
age
> 200


移除全局作用域

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


本地作用域

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

eg:

<?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);
}
}


作用域被定义好了之后,就可以在查询模型的时候调用作用域方法,但调用时不需要加上 scope 前缀,你甚至可以同时调用多个作用域,例如:

$users = App\User::popular()->active()->orderBy('created_at')->get();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: