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();
複製代碼
相關文章
相關標籤/搜索