2016-08-01 18 views
0

Was ich versuche, ist folgendes zu erreichen:WhereNotIn Subquery

Ich möchte überprüfen, ob es einen Datensatz mit dem gleichen client_code ist jedoch mit einer niedrigeren/verschiedenen campaign id. Ich bin mit einer Unterabfrage für jetzt und ich versuchte es mit einem als gut zu tun kommen, aber ich konnte die Logik arbeitet

nicht bekommen Dies ist, was ich habe jetzt:

$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) 
    ; 

irgendwelche Tipps auf, wie man die Logik arbeiten würde groß sein

Antwort

0

Sie können die ->toSql(); Methode verwenden, um das SQL zu sehen, also können Sie Ihre Abfrage refactrorize.

+0

Das gibt '' 0 => Array: 3 [ "Abfrage" => „select count (*) als Aggregat von' campaigns' als 'c' innere Verknüpfung 'campaign_customers' als' cc' auf 'cc '.'campaign_id' =' c'.'id' wo 'c'.status' =? und' c'.scheduled' =? und c.scheduled_at <= NOW() und 'cc'.'status =? und 'cc'.active' =?" "Bindungen" => array: 4 [ 0 => 1 1 => 1 2 => 2 3 => 1 ] "time" => 0,51 ] ] '' – Taacoo

+0

Ich gehe davon aus, dass jeder ? ist eine schlechte Rendite von den Modellen? – Taacoo

+0

Nein, das "?" Symbole sind die Abfrageinformationen, die sich von einer Abfrage zu einer anderen ändern können: die Variablen, die Sie an die Abfrage übergeben. –

0

Die whereNotIn wahrscheinlich sollte kein = darin haben

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

bearbeiten

Versuchen:

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

ich denke, die whereRaw oder vielleicht eine einzelne Textzeichenfolge sein sollte Sie können where hier verwenden (Blick auf diese für Referenz https://laravel.com/docs/5.2/queries#advanced-where-clauses). Auch DB::raw(1) wird eine 1 für jedes Unterabfrageergebnis zurückgeben, aber Sie möchten eine ID für die whereNotIn.

+0

Behoben das, aber nicht den Trick. Es scheint nicht den Wert des übergeordneten 'c.id' zu erhalten. Irgendwelche Ideen? – Taacoo