2016-12-05 27 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

模型的关系是否足够?你究竟需要什么? 我会为这个特定问题添加关系到问题 –

相关问题