【问题标题】:Laravel concat in query (where condition)Laravel concat 查询(where 条件)
【发布时间】:2014-10-04 08:13:45
【问题描述】:

我是 laravel 的新手(从今天开始),在构建简单查询时遇到了问题:

$query->orWhere("CONCAT(`nvp`, ' ', `vpv`)", 'LIKE', "%$this->searchNeedle%");

上面的这一行是封装查询条件中的几个条件之一。我认为这种情况下不需要其他行,但请告诉我您是否需要查看它们。

我发现开发者决定添加一个

`

在第一个 orWhere/where 参数之前和之后导致我不能使用简单的 concat 的问题,因为上面的行将导致:

`CONCAT(`vpv`, ' ', `nvp`)` LIKE ?)' 
↑                         ↑
this                    & this

由于这是自动添加的,我无法在不覆盖我不会的 laravel-core 函数的情况下删除它。是否有任何基于 SQL 的“hack”可以处理这两个 ` ?像 1 = 1 这样的东西,你知道吗?

也许你有另一种解决方案让我得到预期的结果,将一个字符串与两行组合进行比较?

【问题讨论】:

    标签: sql laravel


    【解决方案1】:

    使用 orWhereRaw 执行原始 where 查询:

    $query->orWhereRaw("CONCAT(`nvp`, ' ', `vpv`) LIKE ?", ['%'.$this->searchNeedle.'%']);
    

    【讨论】:

    • 它对我不起作用(SQL 错误)。我通过将% 放入第二个参数来修复它:$query->orWhereRaw("CONCAT(nvp, ' ', vpv) LIKE ?", ["%".$this->searchNeedle."%"]);
    • 能否请您在此处查看与 Laravel 表连接相关的问题:stackoverflow.com/questions/52149031/…
    【解决方案2】:

    Laravel 在幕后做了一些事情,比如为你添加刻度线。

    幸运的是,它还提供了一些工具来为您完成工作......

    对于这种类型的事情,DB::raw() 通常工作得很好。试试这样的...

    $query->orWhere(DB::raw("CONCAT(`nvp`, ' ', `vpv`)"), 'LIKE', "%".$this->searchNeedle."%");
    

    【讨论】:

    • 现在应用程序不会崩溃,但会导致:CONCAT(nvp, ' ', vpv) LIKE '%users name%' is null
    • 我觉得我的语法有点不对劲,我只是修改了答案。
    • 看那个。奇迹般有效。谢谢!!
    • 我用这个答案闻到了 sql 注入,` $this->searchNeedle` 直接来自用户。
    • Laravel 会为你处理参数绑定,所以不会有 SQL 注入的机会。如果整个内容都包含在 DB::raw() 中,那么您是正确的。
    猜你喜欢
    • 2017-03-17
    • 2021-09-18
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 2015-12-24
    • 2021-12-02
    相关资源
    最近更新 更多