【问题标题】:laravel 5.3 raw SQL statement in BuilderBuilder中的laravel 5.3原始SQL语句
【发布时间】:2017-03-22 00:24:39
【问题描述】:

我已经应用了一个 laravel 构建器来过滤用户在表单中的搜索输入,但它的效果并不理想。这是我的场景:

我的表单如下所示:

在第一个输入中是自定义查询搜索,其中创建了以下构建器。

return $builder->where('city', 'LIKE', '%' . $value . '%')
                   ->orWhere('first_name', 'LIKE', '%' . $value . '%')
                   ->orWhere('middle_name', 'LIKE', '%' . $value . '%')
                   ->orWhere('last_name', 'LIKE', '%' . $value . '%');

这 3 个下拉菜单由以下代码过滤:

return $builder->where('location', $value); // <-- for "selecteer locatie"
return $builder->where('level', $value); // <-- for "selecteer richting"
return $builder->where('graduation', $value); // <-- for "selecteer diplomajaar"

$value 是用户的输入。

现在,每当我按 3 个下拉选项进行过滤时,它都会像魔术一样发挥作用。每当我尝试将它与第一个过滤器的查询结合使用时,它显示的结果比我实际想要的要多。

所以第一个查询给出了一个 OR 语句,这实际上是错误。我想在可以运行的构建器中放置一个 RAW SQL 语句

 "WHERE `city` LIKE %" . $value . "% 
 OR `first_name` LIKE %" . $value . " 
 OR `middle_name` LIKE %" . $value . " 
 OR `last_name` LIKE %" . $value . " 

在这些符号之间( 'statement' )

有没有一种方法可以单独运行构建器,或者有一种方法可以在 laravel 5.3 构建器中输入原始 SQL 语句?

如果您需要更多信息,请询问。

编辑:我的问题还不够清楚!请参阅下面的说明。

我正在使用 Builder 类在我的表单中制作我的 SQL 过滤器。每当我运行高级搜索并转储我的 Builder 时,我都会在 +where 子句中得到一个带有以下数组的 Builder 对象:

+wheres: array:7 [▼
0 => array:5 [▼
  "type" => "Basic"
  "column" => "city"
  "operator" => "LIKE"
  "value" => "%hof%"
  "boolean" => "and"
]
1 => array:5 [▼
  "type" => "Basic"
  "column" => "first_name"
  "operator" => "LIKE"
  "value" => "%hof%"
  "boolean" => "or"
]
2 => array:5 [▼
  "type" => "Basic"
  "column" => "middle_name"
  "operator" => "LIKE"
  "value" => "%hof%"
  "boolean" => "or"
]
3 => array:5 [▼
  "type" => "Basic"
  "column" => "last_name"
  "operator" => "LIKE"
  "value" => "%hof%"
  "boolean" => "or"
]
4 => array:5 [▼
  "type" => "Basic"
  "column" => "location"
  "operator" => "="
  "value" => "Franeker"
  "boolean" => "and"
]
5 => array:5 [▼
  "type" => "Basic"
  "column" => "level"
  "operator" => "="
  "value" => "MAVO"
  "boolean" => "and"
]
6 => array:5 [▼
  "type" => "Basic"
  "column" => "graduation"
  "operator" => "="
  "value" => "1992"
  "boolean" => "and"
]
]

因为我使用 OR 运算符与 cityfirst_namemiddle_namelast_name 进行比较,所以我应该得到 4 where 子句而不是 7。这是因为 Builder 将第一个输入中调用的 OR 语句视为 AND 语句。

【问题讨论】:

    标签: php sql laravel-5.3


    【解决方案1】:

    我通过替换这个来解决它:

    return $builder->where('city', 'LIKE', '%' . $value . '%')
                       ->orWhere('first_name', 'LIKE', '%' . $value . '%')
                       ->orWhere('middle_name', 'LIKE', '%' . $value . '%')
                       ->orWhere('last_name', 'LIKE', '%' . $value . '%');
    

    进入这个:

    return $builder->where( function($query) use ($value){
    
        $query->where('city', 'LIKE', '%' . $value . '%')
              ->orWhere('first_name', 'LIKE', '%' . $value . '%')
              ->orWhere('middle_name', 'LIKE', '%' . $value . '%')
              ->orWhere('last_name', 'LIKE', '%' . $value . '%');
    });
    

    编辑:当死并转储 Builder 类时,会转储以下 +where 子句

    +wheres: array:4 [▼
     0 => array:3 [▼
      "type" => "Nested"
      "query" => Builder {#216 ▶}
      "boolean" => "and"
     ]
     1 => array:5 [▼
      "type" => "Basic"
      "column" => "location"
      "operator" => "="
      "value" => "Franeker"
      "boolean" => "and"
     ]
     2 => array:5 [▼
      "type" => "Basic"
      "column" => "level"
      "operator" => "="
      "value" => "MAVO"
      "boolean" => "and"
     ]
     3 => array:5 [▼
      "type" => "Basic"
      "column" => "graduation"
      "operator" => "="
      "value" => "1992"
      "boolean" => "and"
     ]
    ]
    

    在数组索引 0 处的嵌套 Builder 类中插入了 OR 语句。

    【讨论】:

      【解决方案2】:

      您的答案应该正确地将它们自己分组。

      对于“如何在 Laravel 5.3 构建器中输入原始 SQL 语句?”

      DB::statement($rawStatement)
      

      确保将值作为第二个参数绑定到statement,您也可以使用

      DB::statement(DB::raw($rawStatement))
      

      还有

       $query->whereRaw("city LIKE %{$value}%")
      

      这对于输入一些查询很有用,但不能解决您的嵌套查询问题。

      如果你想把所有的 wheres 都变成原始的,你必须按照以下方式做一些事情:

      $query->whereRaw($mainQuery)
      ->setBindings([$city, $first_name, $middle_name,  $last_name])
      

      主查询的样子:

      "(city LIKE ? OR first_name LIKE ? OR middle_name LIKE ? OR last_name LIKE ?)"
      

      然后您可以将原始过滤查询附加到该字符串

      "AND location = ?"
      

      【讨论】:

        猜你喜欢
        • 2014-08-20
        • 2021-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-27
        • 1970-01-01
        • 2022-01-20
        • 2023-01-17
        相关资源
        最近更新 更多