Skip to main content

原生SQL查询修改删除

查询

// 返回多行. 每行都是列名和值的关联数组.
// 如果该查询没有结果则返回空数组
$posts = Yii::$app->db->createCommand('SELECT * FROM post')
->queryAll();

// 返回一行 (第一行)
// 如果该查询没有结果则返回 false
$post = Yii::$app->db->createCommand('SELECT * FROM post WHERE id=1')
->queryOne();

// 返回一列 (第一列)
// 如果该查询没有结果则返回空数组
$titles = Yii::$app->db->createCommand('SELECT title FROM post')
->queryColumn();

// 返回一个标量值
// 如果该查询没有结果则返回 false
$count = Yii::$app->db->createCommand('SELECT COUNT(*) FROM post')
->queryScalar();

执行非查询语句(Executing Non-SELECT Queries)

上面部分中介绍的 queryXyz() 方法都处理的是从数据库返回数据的查询语句。对于那些不取回数据的语句, 你应该调用的是 yii\db\Command::execute() 方法。例如,

Yii::$app->db->createCommand('UPDATE post SET status=1 WHERE id=1')
->execute();

yii\db\Command::execute() 方法返回执行 SQL 所影响到的行数。

对于 INSERT, UPDATE 和 DELETE 语句,不再需要写纯SQL语句了, 你可以直接调用 insert()、update()、delete(), 来构建相应的 SQL 语句。这些方法将正确地引用表和列名称以及绑定参数值。例如,

// INSERT (table name, column values)
Yii::$app->db->createCommand()->insert('user', [
'name' => 'Sam',
'age' => 30,
])->execute();

// UPDATE (table name, column values, condition)
Yii::$app->db->createCommand()->update('user', ['status' => 1], 'age > 30')->execute();

// DELETE (table name, condition)
Yii::$app->db->createCommand()->delete('user', 'status = 0')->execute();

你也可以调用 batchInsert() 来一次插入多行, 这比一次插入一行要高效得多:

// table name, column names, column values
Yii::$app->db->createCommand()->batchInsert('user', ['name', 'age'], [
['Tom', 30],
['Jane', 20],
['Linda', 25],
])->execute();

另一个有用的方法是 upsert()。Upsert 是一种原子操作,如果它们不存在(匹配唯一约束),则将行插入到数据库表中, 或者在它们执行时更新它们:

Yii::$app->db->createCommand()->upsert('pages', [
'name' => 'Front page',
'url' => 'http://example.com/', // url is unique
'visits' => 0,
], [
'visits' => new \yii\db\Expression('visits + 1'),
], $params)->execute();

上面的代码将插入一个新的页面记录或自动增加访问计数器。