2016-05-12 16 views
0

私が持っている私は、ユーザーのすべてのチケットを取るためのグローバルスコープを追加しますが、時には、私はどのように行うことができ、この範囲ずにチケットを使用したい laravel 4.2と無視グローバルスコープ

(TicketModel)と呼ばれるモデル雄弁、それ?どのようにこの範囲に

を無視することができ、これはあなたが適用範囲を必要とする場合のために子クラスが約モデル

<?php 
class TicketModel extends Eloquent{ 

    public $timestamps = false; 

    public static function boot() 
    { 
     static::addGlobalScope(new TicketScope); 

    } 


} 

use Illuminate\Database\Eloquent\Builder; 
use Illuminate\Database\Eloquent\ScopeInterface; 

class TicketScope implements ScopeInterface { 

    public function apply(Builder $builder) 
    { 
     $builder->where('user_id', '=', Auth::user()->id_user); 
    } 

    public function remove(Builder $builder){} 

} 

答えて

1

は何ですか?ここで

は例です:

class TicketModel extends Eloquent 
{ 
    // Your model stuff here 
} 

class UserTicketModel extends TicketModel 
{ 
    public static function boot() 
    { 
     static::addGlobalScope(new TicketScope); 
    } 
} 

アイデアは時々範囲を無視することはありませんが、それはあなたがそれを必要なときにそれを使用することです。

あなたが本当にスコープなしのモデルは例外になりたい場合は、スコープを使用しないように、TicketModelからSimpleTicketModel継承を聞かせboot()メソッドをオーバーライドし、このような:

class TicketModel extends Eloquent 
{ 
    public static function boot() 
    { 
     static::addGlobalScope(new TicketScope); 
    } 
} 

class SimpleTicketModel extends TicketModel 
{ 
    public static function boot() 
    { 
     // Do nothing else 
    } 
} 
+0

が、私はより多くを持っています15個のモデルよりも、すべてのクラスを拡張する必要があります – mubarmg

+0

クラスの拡張は1回限りの作業です。スコープを必要としないことを、あなたのモデルに、瞬時に、あるいは別の言葉で伝える必要があります。もう1つの方法は、スコープを無視するたびに(モデルがインスタンス化される前に)メソッドを呼び出すことです。これは、与えられたスクリプト内で複数回ということを意味します...クラスの拡張は大きな問題ではありません。あなたのモデルには、それが何であるかを意味する名前があります。あなたは、タイプヒントのためにそれを使用するかもしれません。 – Arcesilas

+0

Laravel 5.2のコンテナでは、あなたの場合に便利な[コンテキストバインディング](https://laravel.com/docs/5.2/container#contextual-binding)が可能です...しかし、Laravel 4.2 ...:/ – Arcesilas