Laravel Eloquent Faceted Search,这个查询可以吗?

问题描述 投票:0回答:1

我有一个表

inventory
,它与名为
data
的表具有一对多关系。我正在创建一个过滤器应用程序,用户可以在其中按颜色和材料等过滤库存。出于兼容性目的,将此信息存储在
data
表中非常重要。

创建

data
表是为了灵活扩展库存数据。数据表有这些列:

inventory_id
key
value

我想要完成的是,如果用户正在寻找具有棉质材料和蓝色的库存。我希望结果只显示两者的库存。

我的查询的问题是它显示的库存材质为棉质或蓝色。到目前为止我的查询看起来像这样:

$values = array_merge($materialValues, $colorValues);

Inventory::query()->whereHas('data', function ($q) {
    return $q->whereIn('key', [
        Enum::MATERIAL->key,
        Enum::COLOR->key
    ])->whereIn('values', $values);
})

例如,我尝试过类似的方法,但这只会破坏查询。

Inventory::query()->whereHas('data', function ($q) {
    return $q->where('key', Enum::MATERIAL->key)
        ->whereIn('value', $materialValues)
        ->where('key', Enum::COLOR->key)
        ->whereIn('value', $colorValues);
})

另请注意,我需要将其保留为构建器查询,因为我需要对其使用分页方法。

我感到很困惑,这用 eloquent 也可以实现吗?

laravel eloquent filtering faceted-search
1个回答
0
投票

尝试这样的事情:

Inventory::query()
  ->whereHas('data', function ($q) use ($colorValues) {
      return $q->where('key', Enum::COLOR->key)
          ->whereIn('value', $colorValues);
  })
  ->whereHas('data', function ($q) use ($materialValues) {
      return $q->where('key', Enum::MATERIAL->key)
          ->whereIn('value', $materialValues);
  });
© www.soinside.com 2019 - 2024. All rights reserved.