首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MySQL " in“语法绑定Yii2参数的正确方法?

使用MySQL " in“语法绑定Yii2参数的正确方法?
EN

Stack Overflow用户
提问于 2015-05-02 09:03:50
回答 7查看 14.9K关注 0票数 16

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

代码语言:javascript
复制
$sql = $this->db->createCommand("UPDATE some_table SET something='foo' WHERE some_id=:some_id");
$sql->bindValue(':some_id', $some_id);

但是,当该值可能包含多个值时(例如当使用MySQL语法IN时),情况如何?

例如:

代码语言:javascript
复制
$sql = $this->db->createCommand("UPDATE some_table SET something='foo' WHERE some_id IN (:parents)");
$sql->bindValue(':parents', $parents);

现在,正如我所理解的,只有当$parents var只有一个值时才能很好地工作;但是如果它有多个值(如1,2,3 ),那么当您真正想要'1','2','3'1,2,3时,您将得到类似于'1,2,3'的东西。

正确的方法是什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-05-03 09:15:57

最后我就这样做了:

代码语言:javascript
复制
$parents_safe = '';
$parents_sep = explode(',', $parents);

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

$parents_safe = rtrim($parents_safe, ',');

其中$this->dbYii::$app->db的一个实例。

票数 0
EN

Stack Overflow用户

发布于 2016-05-25 12:32:54

我找到了这个解决方案

代码语言:javascript
复制
$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);
票数 8
EN

Stack Overflow用户

发布于 2015-05-05 21:10:27

您只需使用Yii的QueryBuilder函数,一切都将自动处理。试试这个:

代码语言:javascript
复制
$params = [];
$sql = \Yii::$app->db->getQueryBuilder()->update('some_table', ['something' => 'foo'], ['some_id' => [1, 2, 3]], $params);

结果:

代码语言:javascript
复制
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) } 
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30000412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档