生成查询结果

有几种生成查询结果的方法:

结果数组

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()

与上面的 getRow() 方法相同,只是它返回数组。 例如:

<?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()

此方法返回单个结果集,而不像 getRow() 那样在内存中预取全部结果。 如果查询有多个行,它会返回当前行并将内部数据指针向前移动。

<?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()

查询返回的字段(列)数。请确保使用查询结果对象调用该方法:

<?php

$query = $db->query('SELECT * FROM my_table');

echo $query->getFieldCount();

getFieldNames()

以数组形式返回查询返回的字段(列)的名称。 请确保使用查询结果对象调用该方法:

<?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、object 或类名

返回:

包含提取行的数组

返回类型:

array

getResultArray()getResultObject()getCustomResultObject() 方法的包装器。

用法:参见 结果数组

getResultArray()
返回:

包含提取行的数组

返回类型:

array

将查询结果作为行数组返回,其中每行本身是一个关联数组。

用法:参见 结果数组

getResultObject()
返回:

包含提取行的数组

返回类型:

array

将查询结果作为行数组返回,其中每行是一个 stdClass 类型的对象。

用法:参见 获取 stdClass 的数组

getCustomResultObject($class_name)
参数:
  • $class_name (string) – 结果集的类名

返回:

包含提取行的数组

返回类型:

array

将查询结果作为行数组返回,其中每行是指定类的实例。

getRow([$n = 0[, $type = 'object']])
参数:
  • $n (int) – 要返回的查询结果集的索引

  • $type (string) – 请求结果的类型 - array、object 或类名

返回:

请求的行或不存在则为 null

返回类型:

mixed

getRowArray()getRowObject()getCustomRowObject() 方法的包装器。

用法:参见 结果集

getUnbufferedRow([$type = 'object'])
参数:
  • $type (string) – 请求结果的类型 - array、object 或类名

返回:

结果集的下一行或不存在则为 null

返回类型:

mixed

获取下一行结果并以请求的形式返回。

用法:参见 结果集

getRowArray([$n = 0])
参数:
  • $n (int) – 要返回的查询结果集的索引

返回:

请求的行或不存在则为 null

返回类型:

array

将请求的结果集作为关联数组返回。

用法:参见 结果集

getRowObject([$n = 0])
参数:
  • $n (int) – 要返回的查询结果集的索引

返回:

请求的行或不存在则为 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) – 请求结果的类型 - array、object 或类名

返回:

结果集的下一行,不存在则为 null

返回类型:

mixed

从结果集返回下一行。

getPreviousRow([$type = 'object'])
参数:
  • $type (string) – 请求结果的类型 - array、object 或类名

返回:

结果集的上一行,不存在则为 null

返回类型:

mixed

从结果集返回上一行。

getFirstRow([$type = 'object'])
参数:
  • $type (string) – 请求结果的类型 - array、object 或类名

返回:

结果集的第一行,不存在则为 null

返回类型:

mixed

从结果集返回第一行。

getLastRow([$type = 'object'])
参数:
  • $type (string) – 请求结果的类型 - array、object 或类名

返回:

结果集的最后一行,不存在则为 null

返回类型:

mixed

从结果集返回最后一行。

getFieldCount()
返回:

结果集中的字段数

返回类型:

int

返回结果集中的字段数。

用法:参见 结果辅助方法

getFieldNames()
返回:

列名称数组

返回类型:

array

返回结果集中包含的字段名称数组。

getFieldData()
返回:

包含字段元数据的数组

返回类型:

array

生成包含字段元数据的 stdClass 对象数组。

getNumRows()
返回:

结果集中的行数

返回类型:

int

返回查询返回的行数

freeResult()
返回类型:

void

释放结果集。

用法:参见 结果辅助方法