Laravel 查询过滤器

Laravel query filter

有3个table

  1. 工作坊(列:id、姓名、phone、电子邮件)
  2. 服务(列:id、名称)
  3. 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

注意: 将有计数的条件改为服务条件的长度