在Yii2中使用MySQL"IN"语法绑定参数的正确方法?

Bre*_*ett 9 php mysql yii yii2

好的,我正在使用Yii2,我熟悉使用mysql查询时准备/绑定数据,例如:

$sql = $this->db->createCommand("UPDATE some_table SET something='foo' WHERE some_id=:some_id");
$sql->bindValue(':some_id', $some_id);
Run Code Online (Sandbox Code Playgroud)

但是,当值可能包含多个值时,例如何时使用MySQL语法IN

例如:

$sql = $this->db->createCommand("UPDATE some_table SET something='foo' WHERE some_id IN (:parents)");
$sql->bindValue(':parents', $parents);
Run Code Online (Sandbox Code Playgroud)

现在据我所知,如果$parentsvar只有一个值,那么上面只会很好用; 但如果它有多个值,例如1,2,3,那么你最终会喜欢的东西'1,2,3',当你真的想要'1','2','3'OR 1,2,3.

这样做的正确方法是什么?

小智 7

我找到了这个解决方案

$params = [];
$sql = \Yii::$app->db->getQueryBuilder()->buildCondition(['IN', 'some_id', $ids], $params);
//$sql = some_id NOT IN (:qp0, :qp1, :qp2)
//$params = [':qp0'=>1, ':qp1'=>2, ':qp2'=>3]
$this->db->createCommand("UPDATE some_table SET something='foo' WHERE $sql", $params);
Run Code Online (Sandbox Code Playgroud)


las*_*ovl 6

您可以使用Yii的QueryBuilder功能,一切都将自动处理.试试这个:

$params = [];
$sql = \Yii::$app->db->getQueryBuilder()->update('some_table', ['something' => 'foo'], ['some_id' => [1, 2, 3]], $params);
Run Code Online (Sandbox Code Playgroud)

结果:

string(78) "UPDATE `some_table` SET `something`=:qp0 WHERE `some_id` IN (:qp1, :qp2, :qp3)"
array(4) { [":qp0"]=> string(3) "foo" [":qp1"]=> int(1) [":qp2"]=> int(2) [":qp3"]=> int(3) } 
Run Code Online (Sandbox Code Playgroud)


Bre*_*ett 0

我最终这样做了:

$parents_safe = '';
$parents_sep = explode(',', $parents);

foreach ($parents_sep as $parent) {
    $parents_safe .= $this->db->quoteValue($parent) . ',';
}

$parents_safe = rtrim($parents_safe, ',');
Run Code Online (Sandbox Code Playgroud)

哪里$this->db有 的实例Yii::$app->db