所以,我试图选择一些记录,如果它们不存在于另一个表中。
我有三个模型, Lead , SalesLog 和 Cron ,我们的想法是获取所有尚未在SalesLog中的潜在客户以及{ {1}}字段大于或等于 Crons created_at
字段。
到目前为止,有一些看起来像这样的东西,但它根本不起作用
duplicated_days
我可以使用过滤器,但我最终可能会在 $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
,而不是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个应该在这里使用的模型, Lead 模型引用leads
表,其中包含每个广告系列的潜在客户 广告系列模型, Cron 模型,其中包含属于广告系列的所有Crons。
最后还有 SalesLog 模型,所有潜在客户,一旦通过CURL发送,就会添加到此表中,这就是我如何判断哪些潜在客户已发送以及广告系列
所以,回顾一下
广告系列是可通过 hasMany访问潜在客户模型和 Cron 模型的顶级模型他们之间的关系。
潜在客户是存储所有潜在客户的表格的模型。无论广告活动如何。它属于 广告系列,而有许多 SalesLog
Cron 也属于 广告系列,有 销售日志通过另一个模型。
最后, SalesLog 属于 广告系列,属于 潜在客户
所以我的想法是通过 Cron 我可以访问该Cron的所有 SalesLogs ,我需要从
答案 0 :(得分: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();
答案 1 :(得分:0)
您可以使用pluck
来获取ID,该ID不会在其他表格中显示,请遵循以下说明,
$unapproved = $this->approval->where('user_id', $user_id)->pluck('approved_by')->all();
$unapproved = $this->company->whereNotIn('id', $unapproved)->with('countries')->get();