[Yii2笔记]008使用AR获取数据(Accessing Data) [ 技术分享 ]
说明
学习Yii Framework 2(易2框架)的过程是漫长的,也是充满乐趣的,以下是我学习Yii2框架时对官网英文资料(请参见原文网址)的翻译和代码实现,提供了较完整的代码,供你参考。不妥之处,请多多指正!
原文网址:
http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#accessing-data
4、Accessing Data(获取数据)
本文主题:使用AR获取数据(Accessing Data)
4、使用AR获取数据(Accessing Data)
如前所述,从数组库中获取的数据被装配到Active Record实例中,并且查询结果的每一行对就一个Active Record实例,你可以通过获取Active Record实例属性的方法来获取列值,例如:
// "id" and "email" are the names of columns in the "customer" table
$customer = Customer::findOne(123);
$id = $customer->id;
$email = $customer->email;
注意:Active Record的属性名称与表字段以区分大小写的方式一一对应,Yii自动定义Active Record的属性,你不需要定义任何属性。
因为Active Record的属性是根据表这段名来定义的,你或许会在PHP中发现这样的代码:$customer->first_name,如果在表字段名是以下划线去分隔单词,在属性中也是同样使用。如果你很关注代码风格,你可以重新命名表字段名命名规则(例如使用驼峰格式)。
//Data Transformation(数据转换) 输入/显示的数据格式与数据库中存储的信息格式不相同是很常见的,例如:在数据库中你存储客户的生日是一个UNIX时间戳(尽管不是一个好的设计),在很多情况下你更喜欢将生日处理为字符串格式'YYYY/MM/DD',要实现这个目标,你可以在Active Record类Customer中定义数据转换方法,代码如下:
class Customer extends ActiveRecord
{
// ...
public function getBirthdayText()
{
return date('Y/m/d', $this->birthday);
}
public function setBirthdayText($value)
{
$this->birthday = strtotime($value);
}
}
现在,在你的PHP代码中,你将使用$customer->bithdayText,而不是$customer->birthday,这样,你就能用'YYYY/MM/DD'格式来输入和显示用户生日了。
小贴士:上例展示了一个转换不同数据格式的通用方法,如果要处理日期值,你可以使用DataValidator和DatePicker,它们更强大,也更易于使用。
//Retrieving Data in Arrays(以数组形式获取数据) 尽管获取Active Record对象形式的数据非常方便和灵活,但当数据量非常大,导致占用了大量的内存空间时,在执行查询方法之前,你可以调用asArray()方法以获取PHP数组形式的数据:
// return all customers
// each customer is returned as an associative array
$customers = Customer::find()
->asArray()
->all();
注意:尽管此方法能够节省空间、提升性能,获取的内容更接近于DB底层抽象层,并且你将丢失很多Active Record特性。在列值的数据类型上存在一个非常大的差异。当你返回Active Record实例数据时,列值将根据列实际的数据类型进行匹配;当返回数组数据时,列值将不管数据库字段是何类型,都将是一个字符串(因为它们是未经过何处理的PDO结果集)。
//Retrieving Data in Batches(在批处理中获取数据) 在Query构造器章节,我们已经解释了当要从数据库查询大量数据时,你可以使用batch查询以使使用的内存最小化。在Active Record中你可以使用相同的技术,例如:
// fetch 10 customers at a time
foreach (Customer::find()->batch(10) as $customers) {
// $customers is an array of 10 or fewer Customer objects
}
// fetch 10 customers at a time and iterate them one by one
foreach (Customer::find()->each(10) as $customer) {
// $customer is a Customer object
}
// batch query with eager loading
foreach (Customer::find()->with('orders')->each() as $customer) {
// $customer is a Customer object with the 'orders' relation populated
}
(全文完)
共 0 条回复
阿江
最后登录:2024-03-03
在线时长:186小时21分
- 粉丝94
- 金钱16816
- 威望160
- 积分20276