laravel中scope的用法以及技巧

laravel中scope的用法以及技巧

laravel中的scope作用域

laravel中在模板中处理(属于不属于)的数据(增删改查),引入了scope来处理

也就是在模板定义方法中,加上前缀scope。

简言之,Laravel中模型中可以定义scope开头方法,这类方法可以通过模型直接调用。这类方法也称作查询作用域。

<?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后面跟的字母要大写(小驼峰命名法)

后面那我们去控制器进行处理数据
在控制器中使用:去除scope前缀,首字母变小写调用就好啦.

定义范围后,可以在查询模型时调用范围方法。但是,scope调用方法时不应包含前缀。您甚至可以将调用链接到各种范围,例如:

$users = App\User::popular()->active()->orderBy('created_at')->get();

通过or查询运算符组合多个Eloquent模型范围可能需要使用Closure回调:

$users = App\User::popular()->orWhere(function (Builder $query) {
    $query->active();
})->get();

但是,由于这可能很麻烦,Laravel提供了一种“更高阶” orWhere方法,允许您在不使用闭包的情况下流畅地将这些范围链接在一起:

$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();

原文地址:https://juejin.im/post/5d83585b5188257e5c1115d1

发布了76 篇原创文章 · 获赞 112 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq175023117/article/details/101032253