2016-08-01 2 views
0

То, что я пытаюсь достичь следующего:WhereNotIn Subquery

Я хочу, чтобы проверить, есть ли запись с тем же client_code, но с более низким/различным campaign id. Я использую подзапрос сейчас и я пытался сделать это с объединением, как хорошо, но я не мог получить логику рабочего

Это то, что я получил в настоящее время:

$oDB = DB::table('campaigns AS c') 
     ->select(
      'c.id AS campaign_id', 
      'cc.id AS campaign_customer_id' 
     ) 
     ->join('campaign_customers AS cc', 'cc.campaign_id', '=', 'c.id') 
     ->where('c.status', '=', ModelCampaign::STATUS_PLANNED) 
     ->where('c.scheduled', '=', 1) 
     ->whereRaw('c.scheduled_at <= NOW()') 
     ->where('cc.status', '=', ModelCampaignCustomer::STATUS_INVITE_EMAIL_SCHEDULED) 
     ->whereNotIn('cc.client_code', '=', function ($query){ 
      $query ->select(DB::raw(1)) 
        ->from('campaign_customers') 
        ->whereRaw('campaign_id', '!=', 'c.id'); 
     }) 
     ->where('cc.active', '=', 1) 
    ; 

любые советы о том, как работать логика будет замечательно

ответ

0

Вы можете использовать метод ->toSql();, чтобы увидеть SQL, чтобы вы могли реорганизовать свой запрос.

+0

Это возвращает '' 0 => Массив: 3 [ "запрос" => «выберите отсчет (*) в качестве заполнителя из' 'campaigns', как c' внутреннее соединение' 'campaign_customers', как cc' на' куб.см '.'campaign_id' =' c'.'id' где 'c'.'status' =? и' c'.'cheduled' =? и c.scheduled_at <= NOW() и 'cc'.status' =? и 'cc'.'active' =?" "привязки" => массив: 4 [ 0 => 1 1 => 1 2 => 2 3 => 1 ] "время" => 0,51 ] ] '' – Taacoo

+0

Я полагаю, что каждый ? это плохой возврат от моделей? – Taacoo

+0

Нет, "?" символы - это информация запроса, которая может изменяться от одного запроса к другому: переменные, которые вы передаете в запрос. –

0

whereNotIn, вероятно, не должны иметь = в нем

->whereNotIn('cc.client_code', function ($query){ 
    .... 

редактировать

Try:

->whereNotIn('cc.client_code', function ($query){ 
    $query->select(DB::raw('client_code')) 
      ->from('campaign_customers') 
      ->whereRaw('campaign_id != c.id'); 
    }) 

Я думаю, что whereRaw должен быть один текстовая строка или, может быть, вы можете использовать where здесь (смотря на это для справки https://laravel.com/docs/5.2/queries#advanced-where-clauses). Также DB::raw(1) собирается вернуть 1 для каждого результата подзапроса, но вам нужен идентификатор для whereNotIn.

+0

Исправлено это, но не трюк. Кажется, он не получает значение родительского 'c.id'. Есть идеи? – Taacoo