我想知道 DB::statement 和 DB::unprepared 查询之间出现的问题,所以显然 DB::statement 方法不能用于对列本身执行表达式的查询,如下所示:
更新标签集?= ? + 2 哪里?> ? AND user_id = ? AND tree_id = ?
这将导致 SQL 为:
更新标签 SET rgt = rgt + 2 WHERE rgt > 2 AND user_id = 1 AND tree_id = 1
^这个查询在 mysql 解释器中使用时绝对可以正常工作,但使用 laravel 的 DB::statement 方法(顺便说一句,它可以正常工作与未准备的方法一起使用)。
这种不匹配背后的原因是什么?
它弹出的错误很SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax奇怪,因为它的语法正确并且已经可以在 mysql 上正常工作。
所以语句方法是这样做的:
{
return $this->run($query, $bindings, function ($query, $bindings) {
if ($this->pretending()) {
return true;
}
$statement = $this->getPdo()->prepare($query);
$this->bindValues($statement, $this->prepareBindings($bindings));
$this->recordsHaveBeenModified();
return $statement->execute();
});
}
而毫无准备的人:
{
return $this->run($query, [], function ($query) {
if ($this->pretending()) {
return true;
}
$this->recordsHaveBeenModified(
$change = ($this->getPdo()->exec($query) === false ? false : true)
);
return $change;
});
}
我认为问题在于prepare方法。