使用 Laravel 9 中的范围比较两个相关表中的两列

Compare two columns from two related tables using scopes in Laravel 9

我正在尝试创建一个范围来比较两个相关 table 上的两列。

基于这些 tables 我希望能够获得 ServiceCall 模型的所有实例,其中 next_service_date 在接下来的 15 天内,其中 Customer 模型具有 last_contact_datenull 值,或者它在 ServiceCallnext_service_date.

之前的位置

相关table结构:

客户

service_calls

为我想要完成的工作SQL:

SELECT service_calls.next_service_date, customers.last_contact_date FROM service_calls 
INNER JOIN customers ON service_calls.customer_id = customers.id
WHERE service_calls.next_service_date BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 15 DAY)
AND (customers.last_contact_date < service_calls.next_service_date OR customers.last_contact_date IS NULL);

有没有办法用作用域完成 SQL customers.last_contact_date < service_calls.next_service_date 的这一部分?

这是我目前所拥有的,除了上述之外,它可以完成所有的事情。

客户型号:

public function scopeNotContacted(Builder $builder): Builder
{
    return $builder->whereNull('last_contact_date');
}

服务调用模型:

public function scopeUpcoming(Builder $builder): Builder
{
    return $builder->whereBetween('next_service_date', [
        Carbon::today(),
        Carbon::today()->addDays(15)
    ])->whereHas('customer', fn ($builder) => $builder->notContacted());
}

谢谢!

我可以使用额外的包解决这个问题 kirschbaum-development/eloquent-power-joins

我从 Customer 模型中删除了范围

ServiceCall 模型:

public function scopeNotContacted($builder)
{
    $builder->joinRelationship('customers', function ($join) {
        $join->where(function ($query) {
            $query->whereNull('customers.last_contact_date')
                  ->orWhereRaw('customers.last_contact_date < service_calls.next_service_date');
        });
    });
}

public function scopeUpcoming($builder)
{
    $builder->whereBetween('next_service_date', [
        Carbon::today(),
        Carbon::today()->addDays(15)
    ])->notContacted();
}