laravel 5.3构建器

时间:2016-11-08 11:33:29

标签: php sql laravel-5.3

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

我的表单如下:form search functionality

第一个输入中的

是自定义查询搜索,其中包含以下构建器。

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语句,实际上就是bug。我想在我可以运行的构建器中放置一个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 where子句而不是7 即可。这是因为Builder将第一个输入中调用的OR语句看作AND语句。

2 个答案:

答案 0 :(得分: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 . '%');
});
  

编辑:以下+ where子句在die并转储Builder类时被转储

+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语句。

答案 1 :(得分:0)

你的答案应该正确地分组。

对于&#34;我如何在Laravel 5.3构建器中输入原始SQL语句?&#34;

DB::statement($rawStatement)

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

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

还有

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

这对于输入某些查询非常有用,但无法解决嵌套查询问题。

如果你想把所有的生物都做好,你就必须采取以下措施:

$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 = ?"