阿江 2017-09-30 15:24:46 3091次浏览 1条回复 0 0 0

说明

学习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()之后不要调用其他的查询构建方法,因为它们会被直接忽略。

(全文完)

  • 回复于 2018-03-08 10:07 举报

    2中提到的,你可以另外配置其他的数据库连接组件,没必要重写方法,WXWorkCapture_15204748301648.png

您需要登录后才可以回复。登录 | 立即注册