使用 Laravel 9 中的范围比较两个相关表中的两列
Compare two columns from two related tables using scopes in Laravel 9
我正在尝试创建一个范围来比较两个相关 table 上的两列。
基于这些 tables 我希望能够获得 ServiceCall
模型的所有实例,其中 next_service_date
在接下来的 15 天内,其中 Customer
模型具有 last_contact_date
的 null
值,或者它在 ServiceCall
的 next_service_date
.
之前的位置
相关table结构:
客户
- id
- last_contact_date
service_calls
- id
- customer_id
- next_service_date
为我想要完成的工作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();
}
我正在尝试创建一个范围来比较两个相关 table 上的两列。
基于这些 tables 我希望能够获得 ServiceCall
模型的所有实例,其中 next_service_date
在接下来的 15 天内,其中 Customer
模型具有 last_contact_date
的 null
值,或者它在 ServiceCall
的 next_service_date
.
相关table结构:
客户
- id
- last_contact_date
service_calls
- id
- customer_id
- next_service_date
为我想要完成的工作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();
}