一、以createCommand方式:

// YII2中通过createCommand来处理数据库

// 查询多条记录
// {{%user}} 表示如果设置了表前缀,YII会自动帮你替换
$data1 = YII::$app->db->createCommand('select * from {{%user}}')->queryAll(); // 查询一条记录
// createCommand的第二个参数可以进行参数绑定
$data2 = YII::$app->db->createCommand('select * from {{%user}} where id=:id', ['id' => 2])->queryOne(); // 返回一列(第一列)数据
$data3 = YII::$app->db->createCommand('select name from {{%user}}')->queryColumn(); // 返回一个标量值,常用于统计
$data4 = YII::$app->db->createCommand('select count(*) as cnt from {{%user}}')->queryScalar(); // 绑定参数,防止SQL注入问题
// bindValue绑定一个参数
$data5 = YII::$app->db->createCommand('select * from {{%user}} where id=:id')
->bindValue(':id', 3)
->queryOne(); // 绑定多个参数
$data6 = YII::$app->db->createCommand('select * from {{%user}} where id=:id and name=:name')
->bindValues([':id' => 5, ':name' => 'eee'])
->queryOne(); // 绑定参数引用
$id = 7;
$data7 = YII::$app->db->createCommand('select * from {{%user}} where id=:id')
->bindParam(':id', $id)
->queryOne(); // 执行非查询语句
$data8 = YII::$app->db->createCommand('update {{%user}} set name=:name where id=:id')
->bindValues([':name' => 'abcdef', ':id' => 8])
->execute(); // 当然,我们也可以用更加简便的方法
// insert()插入
$data9 = YII::$app->db->createCommand()->insert('{{%user}}', [
'name' => 'test',
'sex' => 1,
'age' => 28,
])->execute(); // batchInsert()批量插入
$data10 = YII::$app->db->createCommand()->batchInsert('{{%user}}', ['name', 'sex', 'age'], [
['111', 1, 11],
['222', 1, 22],
])->execute(); // update()更新
$data11 = YII::$app->db->createCommand()->update('{{%user}}', [
'name' => '1242143214'
], 'id=:id', ['id' => 10])->execute(); // delete()删除
$data12 = YII::$app->db->createCommand()->delete('{{%user}}', 'id=:id', ['id' => 11])->execute(); // 执行事务
$trans = YII::$app->db->beginTransaction(); try {
YII::$app->db->createCommand()->update('{{%user}}', ['age' => 12], 'id=:id', ['id' => 13])->execute();
YII::$app->db->createCommand()->update('{{%user}}', ['age' => 22], 'id=:id', ['id' => 14])->execute(); $trans->commit();
} catch (\Exception $e) {
//如果语句中有一个执行失败,那么就将回滚
$trans->rollBack();
throw $e;
} // 获取表的定义信息
$info = YII::$app->db->getTableSchema('{{%user}}');

  

二、以AR(Active Record)方式操作数据库

我们需要创建一个继承自\yii\db\ActiveRecord的模型,然后重写tableName()函数,返回要操作的表名。

<?php

namespace app\models;

use yii\db\ActiveRecord;

class MyUser extends ActiveRecord
{
public static function tableName()
{
return '{{%user}}';
}
}  

常用操作如下:

// 查询一条记录
// asArray的作用是以数组形式返回结果
// find()会返回一个ActiveQuery对象,ActiveQuery对象继承自yii\db\Query,所以可以使用Query中的所有查询方法
$data1 = MyUser::find()->where(['id' => 1])->asArray()->one(); // 查询多条记录
$data2 = MyUser::find()->where([])->orderBy('id desc')->asArray()->all(); // 根据主键获取一条记录
$data3 = MyUser::findOne(3); // 根据主键获取多条记录
$data4 = MyUser::findAll([4, 5, 6, 7]); // 带条件查询多条记录
$data5 = MyUser::findAll(['sex' => 1]); // 运行原生SQL
$data6 = MyUser::findBySql('select * from {{%user}} where id=:id', [':id' => 8])->asArray()->one(); // 添加数据
// 准备一个新的实例,然后设置对应字段属性,保存
$user = new MyUser();
$user->name = 'test';
$user->sex = 1;
$user->age = 22;
$user->save(); // 修改数据
// 先获取一个对象,然后设置对应字段属性,保存
$upd = MyUser::findOne(10);
$upd->name = 'abcdefg';
$upd->save(); // 修改多条数据
$data7 = MyUser::updateAll(['name' => 'update'], ['sex' => 1]); // 删除一条数据
$del = MyUser::findOne(15);
$del->delete(); // 删除多条数据
$data8 = MyUser::deleteAll(['sex' => 0]); // 事务操作
$user2 = MyUser::findOne(22);
$user3 = MyUser::findOne(33);
$trans = MyUser::getDb()->beginTransaction();
try {
$user2->name = '2222';
$user3->name = '3333';
//修改数据
$user2->save();
$user3->save(); $trans->commit();
} catch (\Exception $e) {
$trans->rollBack();
throw $e;
}

具体更多的操作方式建议查看官方文档。

YII2中操作数据库的方式的更多相关文章

  1. yii2中 选择布局的方式,可以设置不使用布局

    ###yii2中 选择布局的方式,可以设置不使用布局 控制器内成员变量 public $layout = false; //不使用布局 public $layout = "main" ...

  2. ADO.Net操作数据库的方式

    1.使用数据提供程序执行sql或者ddl语句操作数据库. 2.使用oledb操作数据库 3.使用odbc操作数据库 4.使用DataSet操作数据库 前面3种方式都无法避免要使用sql语句,对不同种类 ...

  3. jmeter中操作数据库

    jmeter是如何操作数据库的? 步骤一:导入jdbc的jar包,jmeter本身不能直接连接mysql,所以需要导入第三方的jar包来连接mysql 点击测试计划,添加classpath,选择mys ...

  4. python中操作数据库

    python中要操作数据库,要使用该数据库在python中对应的驱动库,本文介绍python操作mysql数据库 1.首先安装pymysql 2.导入库 3.建立连接 4.建立游标 5.发起请求 6. ...

  5. Android开发12——Andorid中操作数据库的insert的两种方法以及nullColumnHack

    一.发现问题 先看两种方法插入数据 public void save(Person p){ SQLiteDatabase db = dbHelper.getWritableDatabase(); db ...

  6. yii2.0操作数据库

    首先不得不说yii2.0面向对象的比较彻底,建议没学过或者没学好面向对象的同学再看看面向对象. 其次切入正题. 先创建数据库,这步自己写. DROP TABLE IF EXISTS `country` ...

  7. PHP中操作数据库的预处理语句

    今天这篇文章的内容其实也是非常基础的内容,不过在现代化的开发中,大家都使用框架,已经很少人会去自己封装或者经常写底层的数据库操作代码了.所以这回我们就来复习一下数据库中相关扩展中的预处理语句内容. 什 ...

  8. linux中操作数据库的使用命令记录

    1,mysql 查看数据库表编码格式: show create table widget; 修改数据库表编码格式: alter table widget default character set u ...

  9. SqlAlchemy 中操作数据库时session和scoped_session的区别(源码分析)

    原生session: from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalch ...

随机推荐

  1. ARP协议,以及ARP欺骗

    1.定义: 地址解析协议,即ARP(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议.主机发送信息时将包含目标IP地址的ARP请求广播到网络上 ...

  2. webpack+avalon+mmState打包方案

    终于到讲授如何整合avalon社区这个最强大的组件,基于状态机的路由系统了! 基于状态机的路由系统,据我所知,目前世界上只有三款,angular社区的ui-router, 网易出品的stateman, ...

  3. [Linux].deb软件包:wine-qq2013-longeneteam安装与卸载

    --------------------------------------------------------------------------------------------- 首先切换到r ...

  4. 第六次Scrum冲刺

    第六次Scrum冲刺 1.成员今日完成情况 队员 今日完成任务 刘佳 前端构建 李佳 后端设计 周世元 数据设计 杨小妮 博客编写 许燕婷 管理团队当日及次日任务 陈水莲 性能测试用例设计 曾丽丽 性 ...

  5. JS简单示例

    首先感谢海棠学院提供的优质视频资源 学习总是一个由简单到难的过程,由浅入深,一步一个脚印,将学过的点玩的深入一点,才能有所进步,单学习总是枯燥而乏味的,切忌焦躁; 示例代码另存放在github:htt ...

  6. CSS强制换行和禁止换行代码

    一.强制换行      1.word-break: break-all;       只对英文起作用,以字母作为换行依据.      2.word-wrap: break-word;   只对英文起作 ...

  7. ESET官方下载地址

    官方远程下载 ESET NOD32 Antivirus(32位) ESET NOD32 Antivirus(64位) ESET Smart Security(32位) ESET Smart Secur ...

  8. python基础学习Day15 面向对象、类名称空间、对象名称空间 (2)

    一.类 先看一段代码: class Person: animal = '高级动物' walk_way = '直立行走' # 静态属性,静态变量,静态字段 language = '语言' def __i ...

  9. k8s 调度器

    https://blog.csdn.net/qq_21816375/article/details/78209605

  10. ssh架构之hibernate(三)关系映射

    1.单向多对一 1.映射文件配置 2.model: 测试 1.查询测试 执行顺序,先查询多方,在查询一方,一方采用延迟加载 注意:如果不使用一方的数据,就关闭session,报错,同延迟加载中的报错类 ...