这是针对 Laravel 5.2 的。我的问题与 this 问题非常相似。基本上,我正在尝试运行在另一个 question 中向我建议的查询,它在实际执行时返回数据:
>>> 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
但是,这个语句有效:
>>> App\Models\User::whereRaw('CONCAT(name_first, " ", name_last) LIKE "%test%"')->get()
=> Illuminate\Database\Eloquent\Collection {#770
all: [
App\Models\User {#767
id: 1,
name_first: "test",
name_middle: null,
name_last: "user",
email: "test@test.com",
},
],
}
以及关联的 mysql 日志条目:
Prepare select * from `users` where CONCAT(name_first, " ", name_last) LIKE "%test%" and `users`.`deleted_at` is null
Execute select * from `users` where CONCAT(name_first, " ", name_last) LIKE "%test%" and `users`.`deleted_at` is null
Close stmt
如果您能提供有关发生这种情况的原因的任何信息或建议,我们将不胜感激。
最佳答案
实际上这里有一个小问题(来 self 对您的 previous question 的解决方案)。当你使用它时:
User::whereRaw('CONCAT(name_first, " ", name_last) LIKE "%?%"', ['test']);
生成的 SQL 查询字符串将是这样的(在应用绑定(bind)之后):
select * from `users` where CONCAT(name_first, " ", name_last) LIKE "%'test'%" and `users`.`deleted_at` is null
由于引用的值将是 test
,您最终会得到 "%'test'%"
,它将不匹配任何内容。要解决这个问题,您应该像这样将通配符移动到绑定(bind)数组中:
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 . '%');
这将确保连接部分不会被转义。
关于mysql - Eloquent 查询只会准备,不会执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35875128/