Yii2迁移中批量执行SQL仅首条生效,如何实现逐条执行?
Yii2迁移中执行多条SQL语句的正确方式
Yii2默认不支持通过单条createCommand()->execute()执行多条SQL语句(多数数据库驱动出于安全考虑,会忽略分号后的语句),所以你拼接的多条SQL只会跑第一条。以下是几种解决办法:
1. 拆分SQL逐条执行
把拼接好的SQL按分号拆分,循环执行每条语句:
$sql = "UPDATE card_series SET Code = 903 WHERE ID = 1600; DELETE FROM card WHERE SeriesID = 1600;"; // 拆分并过滤空语句(避免分号结尾产生空条目) $statements = array_filter(array_map('trim', explode(';', $sql))); foreach ($statements as $stmt) { if ($stmt) { $this->db->createCommand($stmt)->execute(); } }
2. 使用Yii2迁移内置方法(推荐)
直接用迁移类提供的update、delete等方法,无需手动拼接SQL,还能自动处理参数绑定:
// 执行更新 $this->update('card_series', ['Code' => 903], ['ID' => 1600]); // 执行删除 $this->delete('card', ['SeriesID' => 1600]);
这种方式更符合Yii2的开发规范,也能避免SQL注入风险。
3. 启用多语句执行(不推荐)
如果一定要用单条命令执行多条SQL,可修改数据库连接配置开启多语句支持,但存在注入风险,仅在完全可控的场景下使用:
// 配置文件中修改db连接 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=your_db', 'username' => 'root', 'password' => 'your_pwd', 'charset' => 'utf8', 'attributes' => [ PDO::MYSQL_ATTR_MULTI_STATEMENTS => true, ], ],
之后即可用原方式执行拼接好的SQL:
$this->db->createCommand($sql)->execute();
内容的提问来源于stack exchange,提问作者baby
相关产品推荐
相关产品推荐

