laravel中scope的用法以及技巧php
laravel中的scope做用域laravel
laravel中在模板中处理(属于不属于)的数据(增删改查),引入了scope来处理闭包
也就是在模板定义方法中,加上前缀scope。ui
简言之,Laravel中模型中能够定义scope开头方法,这类方法能够经过模型直接调用。这类方法也称做查询做用域。spa
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model {
/** * Scope a query to only include popular users. * * @param \Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */
public function scopePopular($query) {
return $query->where('votes', '>', 100);
}
/** * Scope a query to only include active users. * * @param \Illuminate\Database\Eloquent\Builder $query * @return \Illuminate\Database\Eloquent\Builder */
public function scopeActive($query) {
return $query->where('active', 1);
}
}
复制代码
laravel中要求在定义的方法scope后面跟的字母要大写(小驼峰命名法)code
后面那咱们去控制器进行处理数据 在控制器中使用:去除scope前缀,首字母变小写调用就好啦.作用域
定义范围后,能够在查询模型时调用范围方法。可是,scope调用方法时不该包含前缀。您甚至能够将调用连接到各类范围,例如:文档
$users = App\User::popular()->active()->orderBy('created_at')->get();
复制代码
经过or查询运算符组合多个Eloquent模型范围可能须要使用Closure回调:get
$users = App\User::popular()->orWhere(function (Builder $query) {
$query->active();
})->get();
复制代码
可是,因为这可能很麻烦,Laravel提供了一种“更高阶” orWhere方法,容许您在不使用闭包的状况下流畅地将这些范围连接在一块儿:string
$users = App\User::popular()->orWhere->active()->get();
复制代码
关于方法中的参数 $query ,查看Api文档了解是 scope 定义的方法有俩个参数,一个是 Builder、一个是 Model。
在 Post 模型方法前加上一个 scope 前缀,做用域老是返回 查询构建器。在调用 scope 做用域的方法时,经过返回的构建器来拼接成完整的查询条件。
有时您可能但愿定义一个接受参数的范围。首先,只需将其余参数添加到您的范围。范围参数应在$query参数以后定义:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model {
/** * Scope a query to only include users of a given type. * * @param \Illuminate\Database\Eloquent\Builder $query * @param mixed $type * @return \Illuminate\Database\Eloquent\Builder */
public function scopeOfType($query, $type) {
return $query->where('type', $type);
}
}
复制代码
如今,您能够在调用范围时传递参数:
$users = App\User::ofType('admin')->get();
复制代码