2016-12-05 29 views
0

をlaravelする「orWhere」を追加私はUserモデルでは1、は雄弁なモデル関係

public function notifications(){ 
    return $this->morphMany('App\Notification','receiver') 
       ->orWhere('type', 2); 
} 

他の条件が存在しない場合、これはうまく機能し、以下のようなモデルの関係を持っています。しかし$userUserのインスタンスがあると私はnotificationsnotificationsから

問い合わせ条件となり、選択

*、$user->notifications->where('status', 1);、同様に呼び出す場合。 receiver_id = 3 およびnotificationsreceiver_idはnullではなく、 notificationsです。私は関係者の条件グループにできないよので、receiver_type =ユーザーまたはtype = 2、ここでstatus = 1

問題があるが、最終条件はORとして働いています。したがって、基本関係条件が失敗しても、status & typeフィールドだけが一致しても、そのレコードがフェッチされます。

私が必要とするのは、関係条件の後に最初と最後に括弧を追加することで、他の条件が適用されても基本クエリには影響しません。

は私が必要なもの:(。。。notificationsreceiver_id = 3 とnotificationsreceiver_id nullでなく、 notificationsreceiver_type =ユーザーまたはtype = 2

選択* notificationsからstatus = 1

答えて

1

チェックアウトParameter Groupingこのような

何か:

Notifications::where('receveier_id', '=', 3) 
->whereNotNull('receveier_id') 
->where(function ($query) { 
     $query->where('receiver_type', '=', 'User') 
      ->orWhere('type', '=', 2); 
}) 
->where('status', '=', 1); 
+0

おかげで動作します!これは機能し、私はパラメータのグループ化を認識しています。私の疑問は、グループ内のmorphManyを含むことであり、@ kapil.devの答えのような解決策を探していました。残念ながらそれはうまくいきませんでした。 –

0

これを試してみてください。..

public function notifications(){ 
    return $this->where(function($query){ 
         $query->morphMany('App\Notification','receiver') 
          ->orWhere('type', 2); 
       }) 
} 

モデル

にこのコードを使用してコードを置き換え希望これは

+0

それはしませんでした! '不明なメソッドを呼び出す\ Database \ Query \ Builder :: morphMany()' –

+0

oohh、別の答えでSteDが提案したようにすべての条件を手動で書くことができるかもしれない –

+0

ありがとう!私はそれをし、それは働いた。しかし、私はこのような何かを期待していた:) –