2016-12-05 30 views
1

所以,我試圖選擇一些記錄,如果他們不存在於另一個表中。 我有三個型號,SalesLog的Cron和想法是讓已經不在SalesLog所有引線和在created_at字段大於或等於比Cronsduplicated_days場。選擇所有不存在於另一個表中的記錄Laravel

到目前爲止,有一些看起來像這樣,但它不是在所有

$leads = Lead::whereIn('status', [$minimumRequiredStatus])->whereNotIn('id', function($query) use ($cron) { 

     $query->table('sales_log')->select(['id'])->where('campaign', $cron->campaign); 

    })->get(); 

工作,我可以使用過濾器,但我最終可能會被成千上萬的leads兩個工作並可能數以百萬計的記錄和sales_log tables ..這讓我擔心離線做它。

我怎麼能運行一個查詢,只會得到所有leads是所要求的狀態,尚未在sales_log內,其created_at場等於或大於,例如說30天。

這個帶有過濾器的版本實際上是按照預期的方式工作的,但是我擔心這種操作在兩個表上都有幾個記錄會對性能產生影響。

$leads = $cron->campaign->validLeads->filter(function($lead) use ($cron) { 

     if($cron->salesLogs->contains(SalesLog::LEAD_ID, $lead->{Lead::ID})) 
      return false; 

     return true; 

    }); 

至於型號都在關注我有4款車型應該用於此處時,模式,是指包含導線用於每個活動一個活動模型中leads表,Cron模型包含所有Crons 屬於 a Campaign。 最後有一個SalesLog模型中,所有的線索,一旦通過CURL發送被添加到這個表,這是我怎麼能告訴從而導致被送往以及其中活動

因此,回顧一下

活動是它可以訪問模型中的頂級型號,並通過的hasMany關係的Cron模型。

是表格的模型,其中所有鉛存儲。無論廣告系列如何。它屬於一個活動有許多SalesLog

克朗屬於一個活動通過其他模型有很多銷售日誌

最後,SalesLog屬於一個活動屬於一個

這樣的想法是通過克朗我可以訪問所有SalesLogs爲克朗,我需要得到所有潛在客戶活動其中領導的ID不在SalesLogs運動

+0

你試過'雄辯:hasNot()方法嗎? –

+0

@AddWebSolutionPvtLtd我找不到該方法的文檔,你能給我一個鏈接嗎? –

+0

[請求鏈接](https://github.com/laravel/framework/issues/3413)。這是GIT請求鏈接。希望這會幫助你。 –

回答

1

豈不左連接就足夠了?

$leads = Lead::whereIn('status', [$minimumRequiredStatus]) 
      ->leftJoin('sales_log', function ($join) use ($cron) { 
       $join->on('leads.id', '=', 'sales_log.lead_id') 
         ->where('sales_log.campaign_id', '=', $cron->campaign->campaign_id); 
      }) 
      ->whereNull('sales_log.id') 
      ->where('created_at', '>=', Carbon::now()->subDays(30)) 
      ->get(); 
+0

感謝您的幫助,但它不是很有效,它返回的線索比預期的要多,我期待回到23(1個應該被排除),並且它從70個(從每個活動中)返回,即使我添加了 ' > where('leads.campaign_id',$ cron-> campaign-> campaign_id)' 進入混合。我有過濾器的另一個版本(這增加了問題),那個工程,但我害怕性能受影響嗎? –

+0

通過查詢執行此操作比通過操作PHP中的對象更有效率,特別是如果您希望它們達到數百萬的數量級,那麼是的,您的工作版本應該會受到性能影響。你能分享更多關於你的兩個表格結構嗎? –

+0

模型的關係是否足夠?你究竟需要什麼? 我會爲這個特定問題添加關係到問題 –

相關問題