3.5 记录和集合

fetchOne()方法的返回值是一个Solar_Sql_Model_Record对象。同样的,fetchAll()fetchAssoc()方法的返回值是一个Solar_Sql_Model_Collection

3.5.1 记录对象

记录对象继承自Solar_Struct,Solar_Struct又实现了ArrayAccess,、CountableIteratorAggregate接口。这意味着,你几乎就可以把记录对象当成数组使用。

<?php
// a single blog record, blog.id = 1
$item = $model->blogs->fetch(1);

// print the name and value of each property
foreach ($item as $col => $val) {
    $label = htmlspecialchars($col);
    $value = htmlspecialchars($val);
    echo "$label: $value<br />";
}

// echo the ID as a property or as an array element
echo $item->id . " is the same as " .  $item['id'];

你也可以调用记录地象的任何方法;这可能是在您的域中实现记录级商业逻辑的方法。

3.5.2 集合对象

和记录对象一样,集合对象也继承自Solar_Struct。这也意味着,你几乎就可以把集合对象当成数组使用。

<?php
// a collection of blog records
$list = $model->blogs->fetchAll();

// print the title of each blog entry.
// note that $n is a sequential array key,
// *not* the primary key value.
foreach ($list as $n => $blog) {
    echo "Primary key ID " . htmlspecialchars($blog->id)
       . " is titled " . htmlspecialchars($blog->title)
       . '<br />';
}

// how many records are in the collection?
$count = count($list);

// using fetchAssoc() will key the collection on the first
// column of the results. in this case, becasue 'id' is the
// first column, the array key and the primary key are the
// same thing.
$list = $model->blogs->fetchAssoc();
foreach ($list as $key => $blog) {
    echo "Primary key ID " . htmlspecialchars($blog->id)
       . " is the same as the assoc key " . htmlspecialchars($key)
       . '<br />';
}
[Note]Note

集合对象在实例化的时候会收集所有数据的记录对象,但是如果你不向它请求记录对象,它就不会创建记录对象。

集合对象提供了几个方法让你获取集合的整体信息。

getPrimaryVals()

返回一个由集合对象中所有记录的主键组成的数组。这不会创建记录对象;它只使用内部结果数组。

getColVals($colname)

返回一个由集合对象中某一字段的所有值构成的数组。这确实会创建记录对象;因为所请求的字段需要记录对象的魔术方法__get()计算求得。

getPagerInfo()

获取集合的页码信息数组。你在使用获取方法的时候,设置了count_pages参数,页码信息数组就是在这个时候定义的,之后便把它直接传递给Solar_View_Helper_Pager (显示分页链接的辅助类)。页码信息数组的键定义在Solar_Sql_Model_Collection::getPagerInfo()中。