【问题标题】:Laravel Query Builder does not run query correctly even thought it binds correctlyLaravel 查询生成器即使正确绑定也无法正确运行查询
【发布时间】:2020-01-24 12:55:16
【问题描述】:

我对 Laravel 查询生成器有疑问。当我尝试将包含某种 sql 代码的变量绑定到我的绑定参数时,它不返回任何结果。如果我运行 enableQueryLog() 我可以看到查询和绑定是正确的。所以代码提供了一个完美的查询,但它并没有相应地执行。

我已经尝试打印出所有重要的变量。我启用了查询日志以查看是否所有设置都正确,它是正确的。当我将变量放入 whereRaw() 中时,就像没有绑定一样,它工作正常。只是没有绑定。

这是我运行的代码:

public function getCarbrands() {

        $name = 'name != Ford';
        try {
            $brands = DB::table('ni_carbrands')
                ->whereRaw(':name',['name'=>$name])
                ->select('id','name')
                ->get();
            echo json_encode( array('info' => 1 ,'status' => 'Successfully found car brands', 'details' => $brands));

        } catch(Exception $e){

            echo json_encode( array('info' => 0 ,'status' => 'Error finding car brands', 'e' => $e)); 

        }

    }

我知道这种绑定功能的使用是不必要的,它只是对我想要构建的其他一些功能的测试。 这是我的查询日志返回的内容:

array:1 [▼
  0 => array:3 [▼
    "query" => "select `id`, `name` from `ni_carbrands` where :name"
    "bindings" => array:1 [▼
      0 => "name != Ford"
    ]
    "time" => 190.25
  ]
]

查询的组成部分似乎都正确,但生成它似乎有些麻烦。

预期的结果是这样的:

{
    "info": 1,
    "status": "Successfully found car brands",
    "details": [
        {
            "id": 1,
            "name": "Toyota"
        },
        {
            "id": 2,
            "name": "Fiat"
        },
        {
            "id": 3,
            "name": "Iveco"
        },
        {
            "id": 4,
            "name": "Citroën"
        },
        {
            "id": 5,
            "name": "Opel"
        },
        {
            "id": 6,
            "name": "Mercedes"
        },
        {
            "id": 8,
            "name": "Volkswagen"
        },
        {
            "id": 9,
            "name": "Renault"
        },
        {
            "id": 10,
            "name": "MAN"
        },
        {
            "id": 11,
            "name": "Nissan"
        },
        {
            "id": 12,
            "name": "Hyundai"
        },
        {
            "id": 13,
            "name": "Peugeot"
        }
    ]
}

但实际结果是:

{"info":1,"status":"Successfully found car brands","details":[]}

非常感谢您的帮助。

【问题讨论】:

  • 能否给出响应码??您在哪里将此数据添加到详细信息??
  • 对不起,我现在把整个函数都放了。响应码是底部提供的信息。

标签: laravel laravel-query-builder


【解决方案1】:

您似乎无法绑定包含运算符的字符串。
看看这个Can I bind a parameter to a PDO statement as a comparison operator? 还有这个binding not null in pdo

【讨论】:

    【解决方案2】:

    糟糕的原始条件: whereRaw(':name',['name'=>$name]) 就像这样:

    $brands = DB::table('ni_carbrands')
                    ->select('id','name')
                    ->whereRaw($name)
                    ->get();
    

    【讨论】:

    • 我知道它是这样工作的。我也在我的问题中说明了这一点。问题是,我不希望它那样工作。更重要的是,我想知道为什么它不像我那样工作。
    • 绑定变量由? 标记分隔。 ':name'你从哪里得到的?变量替换如下->whereRaw('?',['name'=>$name])
    • 我从 laravel 文档和这里的一些帖子中得到它。 laravel.com/docs/5.2/database#running-queries另外,我试过你的方法,还是不行。
    • 我使用的绑定方法也可以,只是在这种情况下不行。
    【解决方案3】:

    你也可以这样用

    $brands = DB::table('ni_carbrands')
                ->select('id','name')
                ->where('name', '!=', 'Ford')
                ->get();
    

    否则您可以在动态字段中设置 where 条件 喜欢

    ->where($name, '!=', 'Ford')
    

    【讨论】:

    • 如前所述,我知道这些版本可以工作并且更容易。我想知道为什么它不能以我使用它的方式与 whereRaw() 一起使用。我之所以想知道这一点是因为我需要它在其他函数中像这样工作。这仅仅是为了测试目的,因为这个查询很简单。
    • 什么意思?
    • Laravel 查询构建器将您的输入原样放在 SQL 查询的 where 子句中。将其视为 where() 函数,其输入参数在插入查询之前不会被处理。 WhereRaw:有时您可能需要在查询中使用原始表达式
    • 如果你访问 Illuminate\Database\Query\Builder 你会找到方法这可能会帮助你public function whereRaw($sql, array $bindings = [], $boolean = 'and') { $type = 'raw'; $this->wheres[] = compact('type', 'sql', 'boolean'); $this->addBinding($bindings, 'where'); return $this; }
    • 已经检查过了,好像没发现问题。就像我说的,构造的查询是 100% 正确的,但由于某种原因,幕后出现了问题。
    【解决方案4】:
    $name = 'name != Ford';
    $brands = DB::table('ni_carbrands')
                    ->whereRaw(':name',['name'=>$name])
                    ->select('id','name')
                    ->get();
    

    这是等价的查询

    select from ni_carbrands where 'name != Ford'
    

    当然不行,因为你有这样的

    select from ni_carbrands where name != Ford
    

    引号中的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 2011-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多