mysql - Eloquent 查询只会准备,不会执行

标签 mysql laravel eloquent prepared-statement

这是针对 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/

相关文章:

mysql - 如何使用php在特定位置回显特定mysql数据?

mysql - 脚本执行mysql查询,返回列名+结果

mysql - 如何在 Apache Tomcat 6 中使用 mySQL

javascript - 预先输入建议,每个建议下方都有文字

php - 在 Laravel 中的何处插入强制性业务数据

使用游标的 mysql 过程

laravel - 如何从品牌中删除 Laravel 并在 Laravel 5 中使用自己的品牌

php - 此路由不支持 POST 方法。支持的方法 : PUT, 修补、删除

laravel - 向 Eloquent Collection 添加新属性

Laravel-如何在 parent 改变时更新所有 child ?