2017-02-03 5 views
0

内のスコープの一部ではありません関係:この複雑な条件が有効と考えられているFoo内のすべてのレコードを選択しますクエリ私はそうのような複雑な範囲の条件を持っているモデルの場合Laravel

class Foo { 
    public function scopeActive(Builder $query) { 
     $dateNow = $now->format('Y-m-d'); 
     $timeNow = $now->second(0)->format('H:i:s'); 
     $query->whereNull('start_date') 
      ->orWhere('start_date', '<', $dateNow) 
      ->orWhere(function (Builder $query) use ($dateNow, $timeNow) { 
       $query->where('start_date', '=', $dateNow) 
        ->where('start_time', '>=', $timeNow); 
      }); 
    } 
} 

(実際の範囲はそれよりもさらに複雑です)。

私はそうのような別のクラスを持っている:

class Bar { 
    public function foos() { 
     return $this->hasMany(Foo::class); 
    } 
} 

Barモデルは、多くのFooのモデルを持っていることを意味します。

私はすべてのBarモデルだけでなく、それに属するすべてのアクティブFooモデルを取得したい場合は今、私は次の操作を実行できます。

Bar::with(['foo', function (HasMany $query) { 
    $query->active(); 
})->get(); 

しかし、どのように私が与えるクエリを書くことができます私はすべてのBarレコードがアクティブではありません。あなたがたが、反転クエリロジックと、反対をしてスコープを持っているだけのようなので、別のスコープのメソッドを作成したい場合は

Bar::with(['foo', function (HasMany $query) { 
    $query->whereNot(function (Builder $query) { 
     $query->active(); 
    }); 
})->get(); 

答えて

0

があるように思えません。効率的な複雑なクエリのためにLaravelを使用してSQLを簡単に逆変換する方法。

あなたはちょうど逆を書く必要があります。

0

(あなたが含まれていませんでした:

は、理想的には私はこのような何かをしたいと思いますあなたの「いくつかの複雑なクエリ」、ので、これは単なる推測です):

public function scopeInactive($query) { 
    return $query->where('is_active', false); 
} 

Laravel: local scopes

+0

複雑な範囲のアイデアを得るために少し編集しました。本当のものはさらに複雑です。それで、私はもう一度それを繰り返す必要はありません –

+0

残念ながら、スコープを逆転する方法はありません。つまり、正確な同じ複雑なクエリを、逆論理で書く必要があります。 – Jeffrey

+0

もっと良い考え方は、次のようにすることです: あなたのモデルに余分な属性を追加してください(例: 'is_active')。次に、定期的にデータベースを更新するスケジュールを設定します。たとえば、毎時、すべての_models_に 'too old'というクエリを照会し、 'is_active'属性をfalseに設定します。次に、単純なスコープを使用して_model_がアクティブであるかどうかを判断することができます。 – Jeffrey

関連する問題