雄辩查询只会准备,而不是执行

时间:2016-03-08 18:27:11

标签: mysql laravel eloquent prepared-statement

这适用于Laravel 5.2。我的问题与this问题非常相似。基本上,我试图运行在另一个question中向我建议的查询,该查询在实际执行时返回数据:

dynamic_cast<>

这是mysql日志显示的内容:

enum

但是,这句话有效:

>>> App\Models\User::whereRaw('CONCAT(name_first, " ", name_last) LIKE "%?%"', ['test'])->get()
=> Illuminate\Database\Eloquent\Collection {#769
     all: [],
   }

以及相关的mysql日志条目:

Prepare   select * from `users` where CONCAT(name_first, " ", name_last) LIKE "%?%" and `users`.`deleted_at` is null
Close stmt

非常感谢有关为何发生这种情况的任何信息或建议。

1 个答案:

答案 0 :(得分:1)

实际上那里存在一个小问题(来自我previous question的解决方案)。当你使用它时:

User::whereRaw('CONCAT(name_first, " ", name_last) LIKE "%?%"', ['test']);

生成的SQL查询字符串将是这个(在应用绑定之后):

select * from `users` where CONCAT(name_first, " ", name_last) LIKE "%'test'%" and `users`.`deleted_at` is null

由于所引用的值为test,您最终会得到"%'test'%",而这些内容将不会匹配。要解决此问题,您应该将通配符移动到绑定数组中,如下所示:

 User::whereRaw('CONCAT(name_first, " ", name_last) LIKE ?', ['%' . $value . '%']);

现在正确引用该值:

select * from `users` where CONCAT(name_first, " ", name_last) LIKE '%test%' and `users`.`deleted_at` is null

还有一种方法是将DB::raw用于您特别希望传递给查询生成器的参数不被转义的位置。因此,在这种情况下,您可以使用常规where,如下所示:

User::where(DB::raw("CONCAT(name, ' ', email)"), 'LIKE', '%' . $value . '%');

这将确保不会转义连接部分。