我正在制作一个系统来过滤用户的需求,而且我必须按所选的所有属性进行过滤,这里是我的查询构建器:
return EncyclopedieModel::with('stats')
->join('equipement_stats', 'equipement_stats.id_equipement', '=', 'equipement.id_equipement')
->join('stats', 'stats.id_stats','=','equipement_stats.id_stats')
->whereIn('stats.id_stats', $filterStats)
->whereIn('id_typeequipement', $filterEquipement)
->whereIn('id_rarete', $filterRarity)
->skip(0 + $toskip)
->take(10)
->get()
->toJson();
我必须过滤统计数据的多个要求。
我首先采用符合用户需求的所有设备,然后通过急切加载获得项目的统计信息。
我的问题是我必须同时获得具有两种统计数据的项目。例如,如果我的项目具有统计数据" 3"和" 7"我必须得到所有包含这些统计数据的项目。
现在,我已经获得了统计数据" 3"以及所有与统计数据相关的设备" 7" ...
我不知道应该如何实现它
编辑:我尝试用汽车和特性进行简化
[
{
"id_car":1,
"nom_car":"Car A",
"rarity": 1,
"caracteristic":[
{
"id_caracterstic":3,
"nom_stats":"Caracteristic A"
},
{
"id_caracterstic":8,
"nom_stats":"Caracteristic W"
},
{
"id_caracterstic":4,
"nom_stats":"Caracteristic Z"
}
]
},
{
"id_car":2,
"nom_car":"Car B",
"rarity": 2,
"caracteristic":[
{
"id_caracterstic":5,
"nom_stats":"Caracteristic P"
},
{
"id_caracterstic":8,
"nom_stats":"Caracteristic W"
},
{
"id_caracterstic":12,
"nom_stats":"Caracteristic ZA"
}
]
},
{
"id_car":1,
"nom_car":"Car C",
"rarity": 2,
"caracteristic":[
{
"id_caracterstic":12,
"nom_stats":"Caracteristic P"
},
{
"id_caracterstic":8,
"nom_stats":"Caracteristic W"
},
{
"id_caracterstic":14,
"nom_stats":"Caracteristic ZDD"
}
]
},
]
就像我必须在我的数据库中找到汽车一样稀有," 2"和特点是8和12。
我现在正在做的方式,我获得了A车,B车和C车,因为我的查询通过所有具有特征8的车辆和所有具有特征12的车辆
我想要的只是当我正在寻找一辆具有特色的汽车时才能获得汽车B和汽车C." 8"和" 12"
答案 0 :(得分:1)
根据您的问题,我的理解是您希望过滤模型以仅包含具有所有必需设备类型的模型。
考虑到这一点,您只需修改现有查询即可使用HAVING
和GROUP BY
。
return EncyclopedieModel::with('stats')
->join('equipement_stats', 'equipement_stats.id_equipement', '=', 'equipement.id_equipement')
->join('stats', 'stats.id_stats','=','equipement_stats.id_stats')
->whereIn('stats.id_stats', $filterStats)
->whereIn('id_typeequipement', $filterEquipement)
->whereIn('id_rarete', $filterRarity)
->groupBy('enclopedie.id_car')
->havingRaw('COUNT(id_typeequipement) = ?', [count($filterEquipement)])
->skip(0 + $toskip)
->take(10)
->get()
->toJson();
GROUP BY
需要对每个不同模型的设备类型进行分组,以便稍后进行比较。 HAVING
本质上是应用于聚合函数的WHERE
子句。在这种情况下,COUNT
。
因此,我们希望找到与指定设备类型数完全匹配的所有模型。
修改 - 定义
SQL中的HAVING子句指定SQL SELECT语句应仅返回聚合值满足指定条件的行。它被添加到SQL语言中,因为WHERE关键字不能与聚合函数一起使用。