【问题标题】:Laravel - how do you SELECT WHERE LIKE?Laravel - 你如何选择喜欢的地方?
【发布时间】:2015-01-09 15:32:18
【问题描述】:

如果我尝试WHERE email = ?,它可以工作,但如果我尝试下面的代码,它不会。有任何想法吗?谢谢。

DB::connection('operator')->select("SELECT * FROM users WHERE email LIKE '%?%'", array('test'));

这就是getQueryLog() 的样子。

  array(3) {
    ["query"]=>
    string(213) "SELECT * FROM users WHERE email LIKE '%?%'"
    ["bindings"]=>
    array(1) {
      [0]=>
      string(1) "test"
    }
    ["time"]=>
    float(1.45)
  }

【问题讨论】:

  • 问题是如果它使用 PDO 进行绑定,那么您会遇到问题,因为 PDO 会自动将参数括在单引号中,从而在服务器上执行查询时导致查询看起来像 SELECT * FROM users WHERE email LIKE '%'test'%'
  • 为什么不使用 Laravel ORM 或 QueryBuilder?
  • @ITroubs:这不是 pdo 的错。首先不能引用占位符。 foo='?' 是字符串文字问号,foo=? 是占位符。
  • @MarcB 嗯,你是对的。我的错。

标签: php select laravel sql-like


【解决方案1】:

您必须将% 放入绑定数组中:

DB::connection('operator')
    ->select("SELECT * FROM users WHERE email LIKE ?", array('%test%'));

另外,使用 Laravel 的 Eloquent ORMQuery Builder 会容易得多

例如,这就是查询构建器的样子:

DB::connection('operator')->table('users')->where('email', 'LIKE', '%test%')->get();

记住在使用用户提供的字符串时转义任何%!像这样:

$escapedInput = str_replace('%', '\\%', $input);

【讨论】:

  • 正确答案,但我仍然希望看到您向 OP 提供使用查询构建器或具有范围的雄辩模型的建议
  • @ITroubs 好了 :)
  • 对,这样更好 ;-)
  • 你必须记住在用户提供的字符串中转义任何%
  • @lukasgeiter - str_replace('%', '\\%', $email)
【解决方案2】:

它在 laravel 5.7 上非常适合我:

$name = "the value that you want to find in the column";
Model::where("field", "LIKE", "\\" . $name . "%")->get()

$name 是您要在列中查找的字符串部分,并带有“%”

"field"是列的字段 你可以用 "%" 代替 "\" (% all chars)

$TheResult = MyModel::where("myFieldOfMyModel", "like", "%" . $name . "%")->get();

在 laravel 5.7 上非常适合我

谢谢

【讨论】:

    【解决方案3】:

    只是逃避你的变量作品:

    $name = "_";
    Model::where("field", "LIKE", "\\" . $name . "%")->get()
    

    希望这对某人有所帮助。

    【讨论】:

    • 你能补充更多关于为什么的信息吗?我似乎找不到双反斜杠功能。是 laravel 特有的吗?
    • 我并没有明确的解释,但这对我有用
    猜你喜欢
    • 2013-04-15
    • 2017-05-27
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 2019-10-06
    相关资源
    最近更新 更多