🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### SQL 基础查询 #### SELECT 查询 *查询返回多行:* $command = $connection->createCommand('SELECT * FROM post'); $posts = $command->queryAll(); 返回单行: $command = $connection->createCommand('SELECT * FROM post WHERE id=1'); $post = $command->queryOne(); 查询多行单值: $command = $connection->createCommand('SELECT title FROM post'); $titles = $command->queryColumn(); 查询标量值/计算值: $command = $connection->createCommand('SELECT COUNT(*) FROM post'); $postCount = $command->queryScalar(); #### UPDATE, INSERT, DELETE 更新、插入和删除等 如果执行 SQL 不返回任何数据可使用命令中的 execute 方法: $command = $connection->createCommand('UPDATE post SET status=1 WHERE id=1'); $command->execute(); 你可以使用insert,update,delete 方法,这些方法会根据参数生成合适的SQL并执行. // INSERT $connection->createCommand()->insert('user', [ 'name' => 'Sam', 'age' => 30, ])->execute(); // INSERT 一次插入多行 $connection->createCommand()->batchInsert('user', ['name', 'age'], [ ['Tom', 30], ['Jane', 20], ['Linda', 25], ])->execute(); // UPDATE $connection->createCommand()->update('user', ['status' => 1], 'age > 30')->execute(); // DELETE $connection->createCommand()->delete('user', 'status = 0')->execute(); `引用的表名和列名 ` 大多数时间都使用以下语法来安全地引用表名和列名: $sql = "SELECT COUNT($column) FROM {{table}}"; $rowCount = $connection->createCommand($sql)->queryScalar(); 以上代码$column 会转变为引用恰当的列名,而{{table}} 就转变为引用恰当的表名。 表名有个特殊的变量 {{%Y}} ,如果设置了表前缀使用该变体可以自动在表名前添加前缀: $sql = "SELECT COUNT($column) FROM {{%$table}}"; $rowCount = $connection->createCommand($sql)->queryScalar(); *预处理语句 * 为安全传递查询参数可以使用预处理语句,首先应当使用:placeholder占位,再将变量绑定到对应占位符: $command = $connection->createCommand('SELECT * FROM post WHERE id=:id'); $command->bindValue(':id', $_GET['id']); $post = $command->query(); 另一种用法是准备一次预处理语句而执行多次查询: $command = $connection->createCommand('DELETE FROM post WHERE id=:id'); $command->bindParam(':id', $id); $id = 1; $command->execute(); $id = 2; $command->execute(); 提示,在执行前绑定变量,然后在每个执行中改变变量的值(一般用在循环中)比较高效. #### 事务 当你需要顺序执行多个相关的的query时,你可以把他们封装到一个事务中去保护数据一致性.Yii提供了一个简单的接口来实现事务操作. 如下执行 SQL 事务查询语句: $transaction = $connection->beginTransaction(); try { $connection->createCommand($sql1)->execute(); $connection->createCommand($sql2)->execute(); // ... 执行其他 SQL 语句 ... $transaction->commit(); } catch(Exception $e) { $transaction->rollBack(); } 我们通过yii\db\Connection::beginTransaction()开始一个事务,通过try catch 捕获异常.当执行成功,通过yii\db\Transaction::commit()提交事务并结束,当发生异常失败通过yii\db\Transaction::rollBack()进行事务回滚. 如需要也可以嵌套多个事务: // 外部事务 $transaction1 = $connection->beginTransaction(); try { $connection->createCommand($sql1)->execute(); // 内部事务 $transaction2 = $connection->beginTransaction(); try { $connection->createCommand($sql2)->execute(); $transaction2->commit(); } catch (Exception $e) { $transaction2->rollBack(); } $transaction1->commit(); } catch (Exception $e) { $transaction1->rollBack(); }