参考:
query方式:https://github.com/yii2-chinesization/yii2-zh-cn/blob/master/guide-zh-CN/db-query-builder.md
Active Record模式 :https://github.com/yii2-chinesization/yii2-zh-cn/blob/master/guide-zh-CN/db-active-record.md
建立数据库链接
class Customer extends ActiveRecord
{
// ...
public static function getDb()
{
return \Yii::$app->db2; // 使用名为 "db2" 的应用组件 默认是db
}
}
声明AR类
namespace app\models;
use yii\db\ActiveRecord;
class Customer extends ActiveRecord
{
/**
* @return string 返回该AR类关联的数据表名
*/
public static function tableName()
{
return 'customer';
}
}
查询数据
// 取回所有活跃客户(状态为 *active* 的客户)并以他们的 ID 排序:
$customers = Customer::find()
->where(['status' => Customer::STATUS_ACTIVE]) //Customer中定义的常量
->orderBy('id')
->all();
// 返回ID为1的客户:
$customer = Customer::find()
->where(['id' => 1])
->one();
// 取回活跃客户的数量:
$count = Customer::find()
->where(['status' => Customer::STATUS_ACTIVE])
->count();
// 以客户ID索引结果集:
$customers = Customer::find()->indexBy('id')->all();
// $customers 数组以 ID 为索引
// 用原生 SQL 语句检索客户:
$sql = 'SELECT * FROM customer';
$customers = Customer::findBySql($sql)->all();
有两个快捷方法:findOne
和 findAll()
用来返回一个或者一组ActiveRecord
实例。前者返回第一个匹配到的实例,后者返回所有。 例如:
// 返回 id 为 1 的客户
$customer = Customer::findOne(1);
// 返回 id 为 1 且状态为 *active* 的客户
$customer = Customer::findOne([
'id' => 1,
'status' => Customer::STATUS_ACTIVE,
]);
// 返回id为1、2、3的一组客户
$customers = Customer::findAll([1, 2, 3]);
// 返回所有状态为 "deleted" 的客户
$customer = Customer::findAll([
'status' => Customer::STATUS_DELETED,
]);
数组形式获取数据
// 以数组而不是对象形式取回客户信息:
$customers = Customer::find()
->asArray()
->all();
// $customers 的每个元素都是键值对数组
批量获取数据
// 一次提取 10 个客户信息
foreach (Customer::find()->batch(10) as $customers) {
// $customers 是 10 个或更少的客户对象的数组
}
// 一次提取 10 个客户并一个一个地遍历处理
foreach (Customer::find()->each(10) as $customer) {
// $customer 是一个 ”Customer“ 对象
}
// 贪婪加载模式的批处理查询
foreach (Customer::find()->with('orders')->each() as $customer) {
}
例子:
// 插入新客户的记录
$customer = new Customer();
$customer->name = 'James';
$customer->email = 'james@example.com';
$customer->save(); // 等同于 $customer->insert();
// 更新现有客户记录
$customer = Customer::findOne($id);
$customer->email = 'james@example.com';
$customer->save(); // 等同于 $customer->update();
// 删除已有客户记录
$customer = Customer::findOne($id);
$customer->delete();
// 删除多个年龄大于20,性别为男(Male)的客户记录
Customer::deleteAll('age > :age AND gender = :gender', [':age' => 20, ':gender' => 'M']);
// 所有客户的age(年龄)字段加1:
Customer::updateAllCounters(['age' => 1]);
查询关联数据
class Customer extends \yii\db\ActiveRecord
{
public function getOrders()
{
// 客户和订单通过 Order.customer_id -> id 关联建立一对多关系
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
}
}
class Order extends \yii\db\ActiveRecord
{
// 订单和客户通过 Customer.id -> customer_id 关联建立一对一关系
public function getCustomer()
{
return $this->hasOne(Customer::className(), ['id' => 'customer_id']);
}
}
join类型关联查询
// 查找所有订单并以客户 ID 和订单 ID 排序,并贪婪加载 "customer" 表
$orders = Order::find()->joinWith('customer')->orderBy('customer.id, order.id')->all();
// 查找包括书籍的所有订单,并以 `INNER JOIN` 的连接方式即时加载 "books" 表
$orders = Order::find()->innerJoinWith('books')->all();