laravel中scope的用法以及技巧

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();
复制代码
相关文章
相关标签/搜索