我有一个查询,让我所有在html复选框数组上选择了某些特定技能的用户,这些值是数据库中技能的ID。
例如,当您具有Laravel和SQL技能时,仅当用户输入laravel和sql或其中之一时,搜索查询才应返回您,否则,不会显示您。
另一种方式是:选择laravel或sql时,它将显示在用户列表中,但是如果同时选择这两个选项,则不会,尽管您仍然拥有这些技能。如果我将or替换为orWhere,则可以正常使用,但即使我们输入您没有的其他技能,也会显示为相关用户。
这是我查询的一部分:
->when(isset($data['skills']) and $data['skills'] != null, function ($query) use ($data){
$query->whereHas('skills', function ($subQuery) use ($data) {
for($i = 0; $i < count($data['skills']); $i++){
$subQuery->where('skills.id', $data['skills'][$i]);
}
});
})
for只是为了打开t 他从前端数据发送了一系列技能。
任何帮助都是有用的。谢谢
答案 0 :(得分:0)
问题在这里有点微妙:
以下是具有相关查询的地方:
select * from skills
where (skills.foreign_id = related_table.id
or `id` = ? or `id` = ? ... -- This is the orWhere part
);
如您所见,对于与该关系ID 或那些技能相对应的所有事物,即使它们不属于该人,或总是正确的,因此基本上所有与之相关的事物都属于该人,再加上一些最终将被过滤的行。
您应该做的是:
->when(isset($data['skills']) and $data['skills'] != null, function ($query) use ($data){
$query->whereHas('skills', function ($subQuery) use ($data) {
$subQuery->where(function ($subSubQuery) use ($data) {
for($i = 0; $i < count($data['skills']); $i++){
$subSubQuery->orWhere('skills.id', $data['skills'][$i]);
}
});
});
})
这将导致如下关系查询:
select * from skills
where skills.foreign_id = related_table.id
and (`id` = ? or `id` = ?) -- orWhere is now wrapped in parentheses
您当然可以总是这样做:
->when(isset($data['skills']) and $data['skills'] != null, function ($query) use ($data){
$query->whereHas('skills', function ($subQuery) use ($data) {
$subQuery->whereIn('skills.id', $data['skills']);
});
})
答案 1 :(得分:0)
for ($i = 0; $i < count($data['skills']); $i++) {
$query->whereHas('skills', function ($subQuery) use ($data, $i) {
$subQuery->where('skills.id', $data['skills'][$i]);
});
}
解决方案是将whereHas放入循环中,以便每次将条件检查为新条件。