WhereNotIn子查询

时间:2016-08-01 12:55:20

标签: mysql database laravel eloquent 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)
    ;

关于如何使用逻辑的任何提示都很棒

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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。