这适用于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
非常感谢有关为何发生这种情况的任何信息或建议。
答案 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 . '%');
这将确保不会转义连接部分。