阿江 2017-09-30 15:31:36 2304次浏览 0条回复 0 0 0

说明

学习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
}

(全文完)

    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册