生成查询结果
有几种方法可以生成查询结果
结果数组
getResult()
此方法将查询结果作为对象数组返回,或在失败时返回空数组。
获取 stdClass 数组
通常您会在 foreach 循环中使用它,如下所示
<?php
$query = $db->query('YOUR QUERY');
foreach ($query->getResult() as $row) {
    echo $row->title;
    echo $row->name;
    echo $row->body;
}
以上方法是 CodeIgniter\Database\BaseResult::getResultObject() 的别名。
获取数组的数组
如果您希望将结果作为数组的数组获取,可以传入字符串 'array'。
<?php
$query = $db->query('YOUR QUERY');
foreach ($query->getResult('array') as $row) {
    echo $row['title'];
    echo $row['name'];
    echo $row['body'];
}
以上用法是 getResultArray() 的别名。
获取自定义对象的数组
您也可以将一个字符串传递给 getResult(),该字符串代表一个类,用于为每个结果对象实例化。
<?php
$query = $db->query('SELECT * FROM users;');
foreach ($query->getResult(\App\Entities\User::class) as $user) {
    echo $user->name;          // access attributes
    echo $user->reverseName(); // or methods defined on the 'User' class
}
以上方法是 getCustomResultObject() 的别名。
getResultArray()
此方法将查询结果作为纯数组返回,或者在没有结果产生时返回空数组。通常您会在 foreach 循环中使用它,如下所示
<?php
$query = $db->query('YOUR QUERY');
foreach ($query->getResultArray() as $row) {
    echo $row['title'];
    echo $row['name'];
    echo $row['body'];
}
结果行
getRow()
此方法返回单个结果行。如果您的查询有多行,它只返回第一行。结果作为 **对象** 返回。以下是一个使用示例
<?php
$query = $db->query('YOUR QUERY');
$row = $query->getRow();
if (isset($row)) {
    echo $row->title;
    echo $row->name;
    echo $row->body;
}
如果您想要返回特定行,可以在第一个参数中提交行号作为数字
<?php
$row = $query->getRow(5);
您还可以添加第二个字符串参数,该参数是用于实例化行的类的名称
<?php
$query = $db->query('SELECT * FROM users LIMIT 1;');
$row   = $query->getRow(0, \App\Entities\User::class);
echo $row->name;           // access attributes
echo $row->reverse_name(); // or methods defined on the 'User' class
getRowArray()
与上面的 row() 方法相同,只是它返回一个数组。示例
<?php
$query = $db->query('YOUR QUERY');
$row = $query->getRowArray();
if (isset($row)) {
    echo $row['title'];
    echo $row['name'];
    echo $row['body'];
}
如果您想要返回特定行,可以在第一个参数中提交行号作为数字
<?php
$row = $query->getRowArray(5);
此外,您可以使用以下变体在结果中向前/向后/第一个/最后一个移动
$row = $query->getFirstRow()$row = $query->getLastRow()$row = $query->getNextRow()$row = $query->getPreviousRow()
默认情况下,它们返回一个对象,除非你在参数中添加“array”
$row = $query->getFirstRow('array')$row = $query->getLastRow('array')$row = $query->getNextRow('array')$row = $query->getPreviousRow('array')
注意
以上所有方法都会将整个结果加载到内存中(预取)。对于处理大型结果集,请使用 getUnbufferedRow()。
getUnbufferedRow()
此方法返回单个结果行,不会像 row() 那样将整个结果预取到内存中。如果您的查询有多行,它将返回当前行并将内部数据指针向前移动。
<?php
$query = $db->query('YOUR QUERY');
while ($row = $query->getUnbufferedRow()) {
    echo $row->title;
    echo $row->name;
    echo $row->body;
}
对于使用 MySQLi,您可以将 MySQLi 的结果模式设置为 MYSQLI_USE_RESULT 以最大限度地节省内存。一般不建议使用此方法,但在某些情况下(例如将大型查询写入 csv)可能会有益。如果您更改结果模式,请注意与之相关的权衡。
<?php
$db->resultMode = MYSQLI_USE_RESULT; // for unbuffered results
$query = $db->query('YOUR QUERY');
$file = new \CodeIgniter\Files\File(WRITEPATH . 'data.csv');
$csv = $file->openFile('w');
while ($row = $query->getUnbufferedRow('array')) {
    $csv->fputcsv($row);
}
$db->resultMode = MYSQLI_STORE_RESULT; // return to default mode
注意
使用 MYSQLI_USE_RESULT 时,在所有记录被获取或执行 freeResult() 调用之前,对同一连接的所有后续调用都会导致错误。 getNumRows() 方法只返回基于数据指针当前位置的行数。MyISAM 表将一直处于锁定状态,直到所有记录被获取或执行 freeResult() 调用。
您可以选择传递“object”(默认)或“array”来指定返回值的类型
<?php
$query->getUnbufferedRow();         // object
$query->getUnbufferedRow('object'); // object
$query->getUnbufferedRow('array');  // associative array
自定义结果对象
您可以将结果作为自定义类的实例返回,而不是 stdClass 或数组,就像 getResult() 和 getResultArray() 方法允许的那样。如果该类尚未加载到内存中,自动加载器将尝试加载它。该对象将具有从数据库返回的所有值,并将其设置为属性。如果这些属性已声明且是非公开的,那么您应该提供一个 __set() 方法以允许设置它们。
示例
<?php
namespace App\Entities;
class User
{
    public $id;
    public $email;
    public $username;
    protected $lastLogin;
    public function lastLogin($format)
    {
        return $this->lastLogin->format($format);
    }
    public function __set($name, $value)
    {
        if ($name === 'lastLogin') {
            $this->lastLogin = DateTime::createFromFormat('!U', $value);
        }
    }
    public function __get($name)
    {
        if (isset($this->{$name})) {
            return $this->{$name};
        }
    }
}
除了下面列出的两种方法外,以下方法也可以使用类名来返回结果:getFirstRow()、getLastRow()、getNextRow() 和 getPreviousRow()。
getCustomResultObject()
将整个结果集作为请求类的实例数组返回。唯一参数是实例化的类名。
示例
<?php
$query = $db->query('YOUR QUERY');
$rows = $query->getCustomResultObject(\App\Entities\User::class);
foreach ($rows as $row) {
    echo $row->id;
    echo $row->email;
    echo $row->lastLogin('Y-m-d');
}
getCustomRowObject()
从查询结果中返回一行。第一个参数是结果的行号。第二个参数是实例化的类名。
示例
<?php
$query = $db->query('YOUR QUERY');
$row = $query->getCustomRowObject(0, \App\Entities\User::class);
if (isset($row)) {
    echo $row->email;              // access attributes
    echo $row->lastLogin('Y-m-d'); // access class methods
}
您也可以以完全相同的方式使用 getRow() 方法。
示例
<?php
$row = $query->getCustomRowObject(0, \App\Entities\User::class);
结果辅助方法
getFieldCount()
查询返回的 FIELDS(列)数量。确保使用您的查询结果对象调用该方法。
<?php
$query = $db->query('SELECT * FROM my_table');
echo $query->getFieldCount();
getFieldNames()
返回一个包含查询返回的 FIELDS(列)名称的数组。确保使用您的查询结果对象调用该方法。
<?php
$query = $db->query('SELECT * FROM my_table');
echo $query->getFieldNames();
getNumRows()
查询返回的记录数量。确保使用您的查询结果对象调用该方法。
<?php
$query = $db->query('SELECT * FROM my_table');
echo $query->getNumRows();
注意
由于 SQLite3 缺乏返回记录计数的有效方法,CodeIgniter 将在内部获取并缓冲查询结果记录,并返回结果记录数组的计数,这可能效率低下。
freeResult()
它释放与结果关联的内存并删除结果资源 ID。通常,PHP 会在脚本执行结束时自动释放其内存。但是,如果您在一个特定脚本中运行大量查询,您可能希望在生成每个查询结果后释放结果,以减少内存消耗。
示例
<?php
$query = $thisdb->query('SELECT title FROM my_table');
foreach ($query->getResult() as $row) {
    echo $row->title;
}
$query->freeResult(); // The $query result object will no longer be available
$query2 = $db->query('SELECT name FROM some_table');
$row = $query2->getRow();
echo $row->name;
$query2->freeResult(); // The $query2 result object will no longer be available
dataSeek()
此方法将内部指针设置为要获取的下一个结果行。它仅与 getUnbufferedRow() 结合使用才有用。
它接受一个正整数,默认值为 0,成功时返回 true,失败时返回 false。
<?php
$query = $db->query('SELECT `field_name` FROM `table_name`');
$query->dataSeek(5); // Skip the first 5 rows
$row = $query->getUnbufferedRow();
注意
并非所有数据库驱动程序都支持此功能,并且将返回 false。最值得注意的是 - 您无法将其与 PDO 一起使用。
类参考
- class CodeIgniter\Database\BaseResult
- getResult([$type = 'object'])
- 参数:
- $type ( - string) – 请求结果的类型 - 数组、对象或类名
 
- 返回值:
- 包含已获取行的数组 
- 返回类型:
- array
 - 它是 - getResultArray()、- getResultObject()和- getCustomResultObject()方法的包装器。- 用法:请参阅 结果数组。 
 - getResultObject()
- 返回值:
- 包含已获取行的数组 
- 返回类型:
- array
 - 将查询结果作为行数组返回,其中每一行都是一个 - stdClass类型的对象。- 用法:请参见 获取 stdClass 数组。 
 - getCustomResultObject($class_name)
- 参数:
- $class_name ( - string) – 结果行的类名
 
- 返回值:
- 包含已获取行的数组 
- 返回类型:
- array
 - 将查询结果作为行数组返回,其中每一行都是指定类的实例。 
 - getRow([$n = 0[, $type = 'object']])
- 参数:
- $n ( - int) – 要返回的查询结果行的索引
- $type ( - string) – 请求的结果类型 - 数组、对象或类名
 
- 返回值:
- 请求的行,如果不存在则为 null 
- 返回类型:
- 混合
 - 是 - getRowArray()、- getRowObject()和- getCustomRowObject()方法的包装器。- 用法:请参见 结果行。 
 - getUnbufferedRow([$type = 'object'])
- 参数:
- $type ( - string) – 请求的结果类型 - 数组、对象或类名
 
- 返回值:
- 结果集中的下一行,如果不存在则为 null 
- 返回类型:
- 混合
 - 获取下一条结果行并以请求的格式返回。 - 用法:请参见 结果行。 
 - getRowArray([$n = 0])
- 参数:
- $n ( - int) – 要返回的查询结果行的索引
 
- 返回值:
- 请求的行,如果不存在则为 null 
- 返回类型:
- array
 - 将请求的结果行作为关联数组返回。 - 用法:请参见 结果行。 
 - getRowObject([$n = 0])
- 参数:
- $n ( - int) – 要返回的查询结果行的索引 :returns: 请求的行,如果不存在则返回 null
 
- 返回类型:
- stdClass
 - 将请求的结果行作为 - stdClass类型的对象返回。- 用法:请参见 结果行。 
 - getCustomRowObject($n, $type)
- 参数:
- $n ( - int) – 要返回的结果行的索引
- $class_name ( - string) – 结果行的类名
 
- 返回值:
- 请求的行,如果不存在则为 null 
- 返回类型:
- $type
 - 将请求的结果行作为请求类的实例返回。 
 - dataSeek([$n = 0])
- 参数:
- $n ( - int) – 要返回的下一条结果行的索引
 
- 返回值:
- 成功返回 true,失败返回 false 
- 返回类型:
- bool
 - 将内部结果行指针移动到所需的偏移量。 - 用法:参见 结果助手方法. 
 - setRow($key[, $value = null])
- 参数:
- $key ( - mixed) – 列名或键值对数组
- $value ( - mixed) – 要分配给列的值,$key 是单个字段名称
 
- 返回类型:
- void
 - 将值分配给特定列。 
 - getNextRow([$type = 'object'])
- 参数:
- $type ( - string) – 请求的结果类型 - 数组、对象或类名
 
- 返回值:
- 结果集的下一行,如果不存在则为 null 
- 返回类型:
- 混合
 - 返回结果集中的下一行。 
 - getPreviousRow([$type = 'object'])
- 参数:
- $type ( - string) – 请求的结果类型 - 数组、对象或类名
 
- 返回值:
- 结果集的上一行,如果不存在则为 null 
- 返回类型:
- 混合
 - 返回结果集中的上一行。 
 - getFirstRow([$type = 'object'])
- 参数:
- $type ( - string) – 请求的结果类型 - 数组、对象或类名
 
- 返回值:
- 结果集的第一行,如果不存在则为 null 
- 返回类型:
- 混合
 - 返回结果集中的第一行。 
 - getLastRow([$type = 'object'])
- 参数:
- $type ( - string) – 请求的结果类型 - 数组、对象或类名
 
- 返回值:
- 结果集的最后一行,如果不存在则为 null 
- 返回类型:
- 混合
 - 返回结果集中的最后一行。 
 - getFieldNames()
- 返回值:
- 列名称数组 
- 返回类型:
- array
 - 返回一个包含结果集中字段名称的数组。 
 - getFieldData()
- 返回值:
- 包含字段元数据的数组 
- 返回类型:
- array
 - 生成一个包含字段元数据的 - stdClass对象数组。
 - getNumRows()
- 返回值:
- 结果集中的行数 
- 返回类型:
- int
 - 返回查询返回的行数