我有一个表
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 也可以实现吗?
尝试这样的事情:
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);
});