Laravel在何处何地

时间:2018-12-19 10:14:59

标签: laravel

我有一个查询,让我所有在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 他从前端数据发送了一系列技能。

任何帮助都是有用的。谢谢

2 个答案:

答案 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放入循环中,以便每次将条件检查为新条件。