[Yii2笔记]007 AR连接到数据库和查询数据 [ 技术分享 ]
说明
学习Yii Framework 2(易2框架)的过程是漫长的,也是充满乐趣的,以下是我学习Yii2框架时对官网英文资料(请参见原文网址)的翻译和代码实现,提供了较完整的代码,供你参考。不妥之处,请多多指正!
原文网址:
http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#db-connection
2、Connecting to Databases(连接到数据库)
http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#querying-data
3、Querying Data(查询数据)
本文主题:AR连接到数据库和查询数据
2、连接到数据库(Connecting to Databases)
默认情况下,Active Records使用db应用组件作为数据库链接去获取和维护数据库中的数据,正如Database Access Objects章节所述,你可以在应用配置中设置db组件的参数:
return [
'components'=>[
'db'=>[
'class'=>'yii\db\Connetion',
'dsn'=>'mysql:host=localhost;dbname=testdb',
'username'=>'demo',
'password'=>'demo',
],
],
];
如果你想使用db组件之外的其他数据库链接,可以重写getDb()方法:
class Customer extends ActiveRecord{
public static function getDb(){
return \Yii::$app->db2;
}
}
3、查询数据(Querying Data)
定义好AR类之后,你就可以使用它从对应的数据表中查询数据了,通常是这样三步: 1、调用yii\mongodb\ActiveRecord::find()方法创建一个查询对象(query object) 2、调用查询构建方法(query building methods)方法构建查询对象,如select()、where()、from()、orderBy等 3、调用一个查询方法(query method)获取数据,获取到的数据是一个AR实例,查询方法如:one()、all()、count()、sum() 正如你所看到的,这个过程与query builder处理过程非常相似,唯一不同之处是,query builder使用了new操作符创建一个查询对象,而现在你使用yii\mongodb\ActiveRecord::find()返回一个新查询对象,这个查询对象是yii\mongodb\ActiveQuery类的实例。
下面是一些使用Active Query查询数据的例子:
// return a single customer whose ID is 123
// SELECT * FROM `customer` WHERE `id` = 123
$customer = Customer::find()
->where(['id' => 123])
->one();
//下例写法错误:条件必须写在where()中,而不是find()中。
//$customer = Customer::find(['id' => 123])->one();
// return all active customers and order them by their IDs
// SELECT * FROM `customer` WHERE `status` = 1 ORDER BY `id`
$customers = Customer::find()
->where(['status' => Customer::STATUS_ACTIVE])
->orderBy('id')
->all();
// return the number of active customers
// SELECT COUNT(*) FROM `customer` WHERE `status` = 1
$count = Customer::find()
->where(['status' => Customer::STATUS_ACTIVE])
->count();
// return all customers in an array indexed by customer IDs
// SELECT * FROM `customer`
$customers = Customer::find()
->indexBy('id')
->all();
在上例中,$customer 是一个Customer对象,$customers 是一个Customer对象数组,它们都是从customer表中获取的数据得来。
信息:因为yii\db\ActiveQuery扩展自yii\db\Query,所以你可以使用Query Builder章节描述的所有查询构建和查询方法。
因为根据主键值或一组列值进行查询是常规操作(common task),Yii为此提供了两个快捷操作方法: yii\db\ActiveRecord::findOne(),返回由查询结果的第一条记录装配的单例Active Record。 yii\db\ActiveRecord::findAll(),返回由一组查询结果填充的Activer Record数组实例。
两个方法都可以有一个参数,参数可以是以下形式之一: 一个标量值:此值被处理为要查询的主键值,Yii将通过读取数据库schema信息自动决定哪列是主键列。 一个标量值数组:此数组值被处理为要查询的主键值。 一个关联数组:数组的键名对应字段名,数组值对应要查询的字段值,请参考Hash Format获取更多详情: http://www.yiiframework.com/doc-2.0/guide-db-query-builder.html#hash-format
以下代码展示了如何使用这些方法:
// returns a single customer whose ID is 123
// SELECT * FROM `customer` WHERE `id` = 123
$customer = Customer::findOne(123);
// returns customers whose ID is 100, 101, 123 or 124
// SELECT * FROM `customer` WHERE `id` IN (100, 101, 123, 124)
$customers = Customer::findAll([100, 101, 123, 124]);
// returns an active customer whose ID is 123
// SELECT * FROM `customer` WHERE `id` = 123 AND `status` = 1
$customer = Customer::findOne([
'id' => 123,
'status' => Customer::STATUS_ACTIVE,
]);
// returns all inactive customers
// SELECT * FROM `customer` WHERE `status` = 0
$customers = Customer::findAll([
'status' => Customer::STATUS_INACTIVE,
]);
注意: yii\db\ActiveRecord::findOne()和yii\db\ActiveQuery::one()在生成SQL语句时都没有添加LIMIT 1,如果查询返回了很多的数据行,你可以明确调用limit(1)以提高性能,例如:Customer::find()->limit(1)->one()。
除了使用查询构建方法,你也可以使用原生的SQL语句来查询数据并装配结果到Active Record对象中,你可以使用如下代码调用yii\db\ActiveRecord::findBySql()方法:
// returns all inactive customers
$sql = 'SELECT * FROM customer WHERE status=:status';
$customers = Customer::findBySql($sql, [':status' => Customer::STATUS_INACTIVE])->all();
在findBySql()之后不要调用其他的查询构建方法,因为它们会被直接忽略。
(全文完)
阿江
最后登录:2024-03-03
在线时长:186小时21分
- 粉丝94
- 金钱16816
- 威望160
- 积分20276