3.4 获取数据

一旦你已经有一个模型对象,你便可以使用它从它关联的表中获取数据。

3.4.1 获取方法

fetch()

根据主键值获取一个记录或集合对象。

fetchAll()

获取一个由记录对象构成的集合对象(按键排序)。

fetchAllAsArray()

fetchAll()一样,除了返回结果外,本方法的返回结果是一个有序二维数组而不是集合对象。

fetchAssoc()

fetchAll()类似,本方法使用关联数组的键获取集合对象(由记录对象构成)。联合数组的键值是结果中对应的第一个字段的值。

fetchAssocAsArray()

fetchAssoc()一样,除了返回结果外,本方法返回的是二维的关联数组而不是集合对象。

fetchCol()

获取一个有序数组,该数组由数据的第一列构成。

fetchOne()

获取一个记录对象。

fetchOneAsArray()

fetchOne()类似,不同的是本方法返回的结果是一个关联数组,键是字段名,值是字段值。

fetchPairs()

获取一个键-值对的关联数组,其中键是第一个字段,值是第二个字段。

fetchValue()

返回一个值;例如:第一行的第一列。

3.4.2 获取方法的参数

对于fetch()方法,其参数是一个主键值(或是由主键值构成的数组)。

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

// a collection of blog records
$list = $model->blogs->fetch(array(1, 2, 5));

其他的获取方法有一系列参数,这些参数最终构成了SELECT语句。这些参数都是以关联数组的形式出现的。

<?php
$fetch = array(
    // SELECT ... FROM blogs AS zim
    'alias' => 'zim',
    
    // select these columns
    'cols' => array('id', 'foo', 'bar', 'SUM(baz) AS total'),
    
    // WHERE conditions
    'where' => array(
        'foo = :foo',
        'dib IN (?)' => array(1, 2, 5),
        'OR bar > ?' => $bar,
    ),
    
    // GROUP BY columns
    'group' => array('zim.id'),
    
    // HAVING conditions
    'having' => array(
        'total > ?' => $total,
    ),
    
    // ORDER BY columns
    'order' => array('total'),
    
    // you can use regular LIMITs ...
    'limit' => array($count, $offset),
    
    // ... or let the model calculate a page-based LIMIT
    'page'   => $page_number,
    'paging' => $rows_per_page,
    
    // do a followup query without limits to get a page count
    'count_pages' => true,
    
    // bind these placeholder values to the query
    'bind' => array('bar' => $bar),
);

// fetch a collection using the fetch params
$list = $model->blogs->fetchAll($fetch);
alias

正常情况下,模型在它产生的SELECT查询语句中只使用表名,不使用别名。但是你可以使用alias指定一个别名。在上面这个示例中,这将产生FROM blogs AS zim

cols

正常情况下,模型将获取表的所有字段。但是你可以使用cols选择你想要的字段,包括那些需要计算得到结果的字段。

where

这是一个WHERE从句的条件数组。每个元素采取两种形式中的一种。第一种是单值形式,这种将直接作为条件传递过去。第二种是键值对形式,其中键中包含一个或多个?占位符;为了防止SQL注入,值这时候才被引用,然后立即放置到SQL条件中。

group

指定GROUP BY从句使用的字段。

having

where从句一样,这是一个HAVING从句的条件数组。

order

指定ORDER BY从句使用的字段。

limit

可能是一个用于指定LIMIT数量的整数;也可能是一个二元数组,用于指定LIMIT的数量和偏移量。这个参数将会覆盖pagepaging的值。

page

当和paging参数一起使用时,这将会获取结果集中指定页码的数据。

paging

在计算页码的时候,根据page值确定每页应该显示多少条记录。

count_pages

当这个参数设置为true时,这将在获取之后产生第二个查询。第二个查询将使用相同的参数执行COUNT(),但是不获取数据,也没有任何数量限制。它将以集合对象的开式返回记录数、页数、第一页和最后一页的页码和其他页的数据。除非你确信你使用分页,否则不要使用这个参数。

bind

这是一个键值对的数组,用于生成SELECT语句时,绑定指定的占位符。

3.4.3 魔术获取方法

通过使用魔术方法__call()动态解析输入的方法名并且把它转化为一系列WHERE从句,模型对象允许获取记录和集合的简写形式。

有两种可识别的魔术方法:fetchAllBy...()fetchOneBy...()。方法名中的其它词被当作被And分隔的字段名(其中column_name会被转化为ColumnName)。方法的参数和方法名中字段的值相等;额外的获取参数中最后一个结尾参数也是可识别的(译者注:如下面示例中最后一个fetch)。

<?php
// fetch a single blog record WHERE foo = 'bar'
$item = $model->blogs->fetchOneByFoo('bar');

// fetch a collection of blogs WHERE foo = 'bar' AND baz = 'dib'
$list = $model->blogs->fetchAllByFooAndBaz('bar', 'dib');

// fetch a collection of blogs WHERE zim = 'gir',
// with additional parameters
$params = array('order' => 'id DESC');
$list = $model->blogs->fetchAllByZim('gir', $params);
[Note]Note

魔术获取方法相对说来会慢一些,如果你发现自己大量重复地使用到一个特殊的获取数据过程,考虑在模型对象中为那个过程写一个方法。