【问题标题】:Laravel complicated where and whereLaravel 复杂的地方和地点
【发布时间】:2019-05-19 19:32:44
【问题描述】:

我有一个查询,可以让所有用户在 html 复选框数组中选择某些特定技能,这些值是技能数据库中的 Id。

当您拥有例如 Laravel 和 SQL 技能时,搜索查询应该仅在用户输入 laravel 和 sql 或其中之一时返回您,否则不应显示您。

现在发生的情况是另一种方式:当您选择 laravel OR sql 时,它会在用户列表中显示您,但如果您同时选择两者,您将不会,但您仍然拥有这些技能。如果我将 where 替换为 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 他从前面传来的技能数组数据。

任何帮助都会很有用。谢谢

【问题讨论】:

    标签: laravel


    【解决方案1】:

    这里的问题有点微妙:

    下面是 whereHas 相关查询的样子:

    select * from skills
    where (skills.foreign_id = related_table.id 
           or `id` = ? or `id` = ? ... -- This is the orWhere part
    );
    

    如您所见,对于与该关系 ID 或那些技能(即使它们不属于该人)相对应的所有内容,or 总是正确的,因此基本上属于的所有内容该人加上一些最终将被过滤的行。

    你应该做的是:

     ->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']);
        });
    })
    

    【讨论】:

    • 感谢您的努力,但我仍然有相同的结果
    • 我刚刚添加了整个查询,如果有帮助的话
    【解决方案2】:
    for ($i = 0; $i < count($data['skills']); $i++) {
                        $query->whereHas('skills', function ($subQuery) use ($data, $i) {
                            $subQuery->where('skills.id', $data['skills'][$i]);
                        });
                    }
    

    解决方案是简单地将 whereHas 放入循环中,以便每次都将条件检查为新条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 2015-03-03
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      相关资源
      最近更新 更多