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();
複製代碼