2016-05-01 4 views
2

でのモデルのために複数のグローバルスコープを定義します。加えては<strong>SoftDelete</strong>能力とポストアクティブステータスを決定する<strong>アクティブ</strong>ブールフィールドを持つ私はポストのモデルを持っているLaravel

class Post extends Model implements SluggableInterface 
{ 
    use SoftDeletes; 

    protected $primaryKey = 'post_id'; 
    . 
    . 
    . 
} 

、ポストモデルは公開投稿の日付を開始保持start_dateフィールドを持っています。

今、Anonymous GlobalScope Laravel 5.2をアクティブな投稿とその投稿start_dat eがNULLかNow()より小さいフィルタリングとフェッチに使用したいと思います。非ソフト削除モデルに加えて。そのために

私はPostモデルにこれを追加しました:単独で

protected static function boot() 
     { 
      parent::boot(); 

      static::addGlobalScope('active', function(Builder $builder){ 
       $builder->where('active',1); 
      }); 

      static::addGlobalScope('scheduled', function(Builder $builder){ 
       $builder 
        ->whereNull('start_date')->orWhere(function ($query) { 
         $query->where('start_date', '<=', Carbon::now()); 
        }); 
      }); 
     } 

activeグローバルスコープ、私はscheduledという名前の二スコープを追加したときに正常に動作しますが、すべてのレコードがソフト削除され、アクティブでないモデルが含ま返します。

問題は何ですか?私は理解できません

答えて

1

orWhereを使用しているからです。これらの事例では、生のSQLを見てLaravelデバッグバーを使用すると、私はあなたのselect文は次のようになり、お金を賭けると思いますので、非常に有用である:1つのOR基準を満たすものを選択することになる

SELECT * FROM table WHERE deleted_at IS NULL AND active=1 AND state_date IS NULL OR (start_Date <= now())

これを修正するには、scheduledをこのようにする必要があります。

SELECT * FROM table WHERE deleted_at IS NULL AND active=1 AND (state_date IS NULL OR start_Date <= now())

私はあなたが欲しいと思うものですどちら:(うまくいけば)クエリは次のように見えてしまい

static::addGlobalScope('scheduled', function(Builder $builder) { 
    $builder->where(function($query)) { 
     $query->whereNull('start_date'); 
     $query->orWhere('start_date', '<=', Carbon::now()); 
    }); 
}); 

関連する問題