SushilkumarSetia
SushilkumarSetia

Reputation: 376

Laravel Model Using Or in where Condition?

I want to get the template from user_webhook table in my database.In WHERE condition i am checking user_id,app_id and if either notify_admin or notify_customer value is 1 in user_webhook table.I am using query..

$templates= $this->where('notify_admin',1)
                 ->orwhere('notify_customer',1)
                 ->where('user_webhooks.user_id',$user_id)
                 ->where('user_webhooks.app_id',$app_id)
                 ->select(  'webhooks.id as webhook_id','webhooks.app_id','webhooks.topic','webhooks.type','webhooks.action',
                            'webhooks.sms_template','user_webhooks.id','user_webhooks.notify_admin',
                            'user_webhooks.notify_customer','user_webhooks.user_id','user_webhooks.sms_template_status',
                            'user_webhooks.sms_template as sms'
                         )
                 ->join ('webhooks',function($join){
                      $join>on('webhooks.id','=','user_webhooks.webhook_id');
                        })
                 ->get()
                 ->toArray();

when i get query using DB::getQueryLog(), I found the query seems Like

select `telhok_webhooks`.`id` as `webhook_id`, `telhok_webhooks`.`app_id`,
 `telhok_webhooks`.`topic`, `telhok_webhooks`.`type`, `telhok_webhooks`.`action`,
 `telhok_webhooks`.`sms_template`, `telhok_user_webhooks`.`id`,
 `telhok_user_webhooks`.`notify_admin`, `telhok_user_webhooks`.`notify_customer`, 
 `telhok_user_webhooks`.`user_id`, `telhok_user_webhooks`.`sms_template_status`, 
 `telhok_user_webhooks`.`sms_template` as `sms` from `telhok_user_webhooks` 

 inner join  
 `telhok_webhooks` on `telhok_webhooks`.`id` = `telhok_user_webhooks`.`webhook_id` 

  where `notify_admin` = ? or `notify_customer` = ? and `telhok_user_webhooks`.`user_id` 
  = ? and  `telhok_user_webhooks`.`app_id` = ?

The result of query giving result of all app_id and user_id. So Please tell me use of OR in where condition. Thanks in advance.

Upvotes: 4

Views: 5665

Answers (2)

Teun
Teun

Reputation: 926

Change

->where('notify_admin',1)
->orwhere('notify_customer',1)

to

->where(function($q){
  $q->where('notify_admin',1)
  ->orWhere('notify_customer',1);
})

Without this, the orWhere will compare to all other wheres in your query instead of just comparing those two columns

Upvotes: 1

Adam Kozlowski
Adam Kozlowski

Reputation: 5896

You may chain where constraints together as well as add or clauses to the query. The orWhere method accepts the same arguments as the where method:

$users = DB::table('users')
                ->where('votes', '>', 100)
                ->orWhere('name', 'John')
                ->get();

Advanced usage:

Usere::where('id', 46)
      ->where('id', 2)
      ->where(function($q) {
          $q->where('Cab', 2)
            ->orWhere('Cab', 4);
      })
      ->get();

The whereIn method verifies that a given column's value is contained within the given array:

$users = DB::table('users')
                    ->whereIn('id', [1, 2, 3])
                    ->get();

More: https://laravel.com/docs/5.5/queries

Upvotes: 4

Related Questions