WhereNotIn子查询

问题描述:

我想要实现的是以下几点:WhereNotIn子查询

我想检查是否存在具有相同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) 
    ; 

任何提示在如何工作的逻辑将是伟大的

您可以使用->toSql();方法来查看SQL,以便您可以重构您的查询。

+0

这返回 ''0 =>数组:3 [ “查询”=>“SELECT COUNT(*)作为从'campaigns'骨料如'C'内部联接'campaign_customers'如''上立方厘米cc' '.'cpaign_id' ='c'.'id' where'c'.'status' =?and'c'.'scheduled' =?and c.scheduled_at 数组:4 [ 0 => 1 1 => 1 2 => 2 3 => 1 ] “时间”=> 0.51 ] ]'' – Taacoo

+0

我认为每?是模型的糟糕回报? – Taacoo

+0

不,“?”符号是可以从一个查询变为另一个查询的查询信息:传递给查询的变量。 –

whereNotIn可能不应该有一个=

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

编辑

尝试:

->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的ID。

+0

修正了这个问题,但没有成功。它似乎没有得到父'c.id'的价值。有任何想法吗? – Taacoo