选择所有不存在于另一个表Laravel

时间:2016-12-05 11:12:32

标签: mysql laravel laravel-5 eloquent

所以,我试图选择一些记录,如果它们不存在于另一个表中。 我有三个模型, 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,而不是leadssales_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 ,我需要从获取所有潜在客户 strong>广告系列,其中 ID 不在广告系列 SalesLogs

2 个答案:

答案 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();