Laravel 查询过滤器
Laravel query filter
有3个table
- 工作坊(列:id、姓名、phone、电子邮件)
- 服务(列:id、名称)
- service_workshop(列:id,workshop_id,service_id,活跃)
table车间和服务之间的多对多关系。
为了在模型中进行过滤,我使用本地范围 https://laravel.com/docs/8.x/eloquent#local-scopes
在前端选择服务时,我应该得到有所选服务的工作室active.But我没有得到我需要的((这是我的方法:
// Model Workshop
public function scopeWithFilters(Builder $query, array $filters)
{
// services dynamic value
$services = array_key_exists("services", $filters) ? $filters["services"] : [];
return $query->when(count($services), function ($query) use ($services) {
$query->whereIn('id', function ($query) use ($services) {
$query->select('workshop_id')
->from('service_workshop')
->where('active', true)
->whereIn('service_id', $services);
});
});
}
With $services = [1,2] ,条件 whereIn('service_id', $services) returns worksop_id 2 和 3,但应该是 3...因为workshop_id = 2 service_id = 2 包含活动 = 0
图片tableservice_workshop
如何正确写请求?
能否分享结果的整行?如果我没有记错的话。结果是有效的,因为它是 return workshop_id 2 由于第一行或 id (117)
的条件
值为:
service_id:1
workshop_id:2
活动:1
这意味着,您有 workshop_id 2 个具有有效值
记住你添加 whereIn [1,2] 只要 service_id 是 1 或 2
就有效
更新:
要确保只有 return 所有 workshop_id 包含所有 service_id 状态为活动,您需要将其分组并添加 having
条件
试试这个:
return $query->when(count($services), function ($query) use ($services) {
$query->whereIn('id', function ($query) use ($services) {
$query->select('workshop_id')
->from('service_workshop')
->groupBy('workshop_id')
->where('active', true)
->whereIn('service_id', $services)
->having(DB::raw('count(*)', >=, count($services)));
});
});
MySQL 查询:
SELECT workshop_id FROM service_workshop WHERE service_id IN (1,2) AND active = 1 GROUP BY workshop_id HAVING COUNT(*) >= 2
注意:
将有计数的条件改为服务条件的长度
有3个table
- 工作坊(列:id、姓名、phone、电子邮件)
- 服务(列:id、名称)
- service_workshop(列:id,workshop_id,service_id,活跃)
table车间和服务之间的多对多关系。 为了在模型中进行过滤,我使用本地范围 https://laravel.com/docs/8.x/eloquent#local-scopes
在前端选择服务时,我应该得到有所选服务的工作室active.But我没有得到我需要的((这是我的方法:
// Model Workshop
public function scopeWithFilters(Builder $query, array $filters)
{
// services dynamic value
$services = array_key_exists("services", $filters) ? $filters["services"] : [];
return $query->when(count($services), function ($query) use ($services) {
$query->whereIn('id', function ($query) use ($services) {
$query->select('workshop_id')
->from('service_workshop')
->where('active', true)
->whereIn('service_id', $services);
});
});
}
With $services = [1,2] ,条件 whereIn('service_id', $services) returns worksop_id 2 和 3,但应该是 3...因为workshop_id = 2 service_id = 2 包含活动 = 0
图片tableservice_workshop
如何正确写请求?
能否分享结果的整行?如果我没有记错的话。结果是有效的,因为它是 return workshop_id 2 由于第一行或 id (117)
的条件值为: service_id:1 workshop_id:2 活动:1
这意味着,您有 workshop_id 2 个具有有效值
记住你添加 whereIn [1,2] 只要 service_id 是 1 或 2
就有效更新:
要确保只有 return 所有 workshop_id 包含所有 service_id 状态为活动,您需要将其分组并添加 having
条件
试试这个:
return $query->when(count($services), function ($query) use ($services) {
$query->whereIn('id', function ($query) use ($services) {
$query->select('workshop_id')
->from('service_workshop')
->groupBy('workshop_id')
->where('active', true)
->whereIn('service_id', $services)
->having(DB::raw('count(*)', >=, count($services)));
});
});
MySQL 查询:
SELECT workshop_id FROM service_workshop WHERE service_id IN (1,2) AND active = 1 GROUP BY workshop_id HAVING COUNT(*) >= 2
注意: 将有计数的条件改为服务条件的长度