Laravel 5.5でのグローバルスコープの動作方法が不明です。私のコントローラでLaravelダイナミックスコープは初めてのみ動作します
、index
は、私がゲッターにフィルタを渡しています:
public function index(SaleFilters $filters)
{
return new SaleCollection($this->getSales($filters));
}
getSales
:
protected function getSales(SaleFilters $filters)
{
$sales = Sale::with('office')->filter($filters);
return $sales->paginate(50);
}
protected function range($range)
{
$dates = explode(" ", $range);
if (count($dates) == 2) {
$this->builder = Sale::with(['office', 'staff'])
->where('sale_date', '>=', $dates[0])
->where('sale_date', '<', $dates[1])
->orderBy('sale_date', 'desc');
return $this->builder;
}
return false;
}
私は私が持っていることになる、などのsale
モデル内のスコープを設定しています思考は、上記のフィルタに自動的に適用されますか?もしそうでなければ、同じスコープを再適用しなければならないのですか?
protected static function boot()
{
parent::boot();
$user = Auth::user();
if (($user) && ($user['office_id'])) {
return Sale::ofOffice($user['office_id'])->get();
}
}
public function scopeOfOffice($query, $office)
{
return $query->where('office_id', $office);
}
ユーザーが適用office_id
を持っているのであれば基本的には、それゆえ、それが唯一のこれまでそのoffice_id
に適用される売上高を返す必要があり、ofOffice
スコープを適用する必要があります。
は、基本的には
Route::get('/sales', '[email protected]')->middleware('auth:api');
axios
.get('api/sales/?range=" + this.rangeFilter)
rangeFilter
は基本的に上記のフィルタクエリに渡され、開始日と終了日であるaxios GET要求を経由して、ページの読み込みに取り組んでいます。
スコープが実際にどのように機能しているか、何かがいつもうまくいかない理由が分かっているかについては、誰かが少し光を当てることができますか?私が言ったように、それはrangeFilter
のデフォルト値を提供するページロードで動作しますが、私はその日を変更して同じAxiosコールで再フェッチするとスコープが適用されないように見え、where office_id = 'x'
私の言う限り、上記の範囲フィルタは最初のページの読み込み時にも実行されるため、なぜそれがそこに適用されるのか、それ以降は適用されないのか分かりません。
まず、ローカルスコープのアイデア(scopeOfOffice')とグローバルスコープのソートの実装を混在させているようです。たぶん、あなたのスコープをドキュメンテーション[states](https://laravel.com/docs/5.5/eloquent#global-scopes)として実装しようとする価値があるかもしれません。つまり、別のクラスとしてsopeを使用し、次に使用される 'addGlobalScope'メソッド'ブート'で。グローバルスコープクラスの 'Auth :: user()'チェックを直接行うことはできません。 – lesssugar
実際に私はそれを "ダイナミックスコープ"に関するドキュメントの状態として実装しました – yoyoma
ああ、わかりました。 – lesssugar