CodeIgniter4 生成查询结果
结果数组
getResult()
这个方法返回 对象数组 类型的查询结果,或在失败时返回 一个空数组 。 典型的用法是使用 foreach 循环,像这样:
$query = $db->query("YOUR QUERY");
foreach ($query->getResult() as $row)
{
echo $row->title;
echo $row->name;
echo $row->body;
}
上面的方法是 getResultObject()
的别名。
如果你想返回一个二维数组,可以给第一个参数传字符串 ‘array’
$query = $db->query("YOUR QUERY");
foreach ($query->getResult('array') as $row)
{
echo $row['title'];
echo $row['name'];
echo $row['body'];
}
上面的方法是 getResultArray()
的别名。
你也可以传字符串参数到 getResult()
方法,表示要为每个结果对象实例化的类
$query = $db->query("SELECT * FROM users;");
foreach ($query->getResult('User') as $user)
{
echo $user->name; // 获取属性
echo $user->reverseName(); // 或访问 'User' 类定义的方法
}
上面的方法是 getCustomResultObject()
的别名。
getResultArray()
这个方法返回一个纯数组的查询结果,查无结果时为空数组。 典型的用法是使用 foreach 循环,像这样:
$query = $db->query("YOUR QUERY");
foreach ($query->getResultArray() as $row)
{
echo $row['title'];
echo $row['name'];
echo $row['body'];
}
单行结果
getRow()
这个方法返回一个单行结果,如果你的查询有多行结果,它仅返回第一条。 返回结果是一个 对象 。使用示例:
$query = $db->query("YOUR QUERY");
$row = $query->getRow();
if (isset($row))
{
echo $row->title;
echo $row->name;
echo $row->body;
}
如果你想返回指定行的结果,可以在第一个参数里提供这个数字:
$row = $query->getRow(5);
你也可以传一个字符串到第二个参数,表示该结果实例化的对象类:
$query = $db->query("SELECT * FROM users LIMIT 1;");
$row = $query->getRow(0, 'User');
echo $row->name; // 获取属性
echo $row->reverse_name(); // 或访问 'User' 类定义的方法
getRowArray()
这个与上面的 row()
方法基本相同,区别是它返回的是一个数组。 示例:
$query = $db->query("YOUR QUERY");
$row = $query->getRowArray();
if (isset($row))
{
echo $row['title'];
echo $row['name'];
echo $row['body'];
}
如果你想返回指定行的结果,可以在第一个参数里提供这个数字:
$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()
把整个结果预加载到内存里。 如果你的查询结果多于一个,它返回当前行并将内部数据指针向前移动。
$query = $db->query("YOUR QUERY");
while ($row = $query->getUnbufferedRow())
{
echo $row->title;
echo $row->name;
echo $row->body;
}
你可以选择性的传参 ‘object’ (默认) 或 ‘array’ 来指定返回数据的类型:
$query->getUnbufferedRow(); // 对象
$query->getUnbufferedRow('object'); // 对象
$query->getUnbufferedRow('array'); // 关联数组
自定义结果对象
你可以用一个自定义的类实例作为返回结果,代替原来的 stdClass
对象或数组,
getResult()
和 getResultArray()
允许如此操作。
如果该类(文件)尚未加载到内存,自动加载器会尝试载入它。 对象的属性值会设置为数据库的返回数据,如果是非公开属性, 你需要提供一个 __set()
方法以允许他们被赋予值。
示例:
class User
{
public $id;
public $email;
public $username;
protected $last_login;
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()
以要求的类实例数组的形式返回整个结果集。 唯一的参数是要实例化的类的名称。
示例:
$query = $db->query("YOUR QUERY");
$rows = $query->getCustomResultObject('User');
foreach ($rows as $row)
{
echo $row->id;
echo $row->email;
echo $row->last_login('Y-m-d');
}
getCustomRowObject()
以要求的类实例形式返回单个结果,第一个参数是它在结果集里的序号, 第二个参数是要实例化的类的名称。
示例:
$query = $db->query("YOUR QUERY");
$row = $query->getCustomRowObject(0, 'User');
if (isset($row))
{
echo $row->email; // 获取属性
echo $row->last_login('Y-m-d'); // 或访问 'User' 类定义的方法
}
你也可以用 getRow()
方法达到相同效果。
示例:
$row = $query->getCustomRowObject(0, 'User');
结果处理辅助方法
getFieldCount()
返回查询结果的字段个数(列数),确保你是使用查询结果对象调用此方法:
$query = $db->query('SELECT * FROM my_table');
echo $query->getFieldCount();
getFieldNames()
返回查询结果的字段名(列名)的数组,确保你是使用查询结果对象调用此方法:
$query = $db->query('SELECT * FROM my_table');
echo $query->getFieldNames();
freeResult()
它会释放查询结果占用的内存并删除资源ID。通常 PHP 会在脚本结束时自动释放内存, 然而,如果你在某个脚本里执行了很多查询,你也许想处理完每个查询后即刻释放内存, 以此减少内存消耗。
举例:
$query = $thisdb->query('SELECT title FROM my_table');
foreach ($query->getResult() as $row)
{
echo $row->title;
}
$query->freeResult(); // $query 的结果对象不再可用
$query2 = $db->query('SELECT name FROM some_table');
$row = $query2->getRow();
echo $row->name;
$query2->freeResult(); // $query2 的结果对象不再可用
dataSeek()
该方法设置一个内部指针,用来获取下一个结果行,它仅和 getUnbufferedRow()
一起使用才有作用。
它接受一个正整数值,默认是0,返回 TRUE 表示成功,FALSE 表示失败。
$query = $db->query('SELECT `field_name` FROM `table_name`');
$query->dataSeek(5); // Skip the first 5 rows
$row = $query->getUnbufferedRow();
注解
不是所有数据库驱动支持这个特性,(不支持的)会返回 FALSE。 最值得注意的是 - 你无法在 PDO 中使用它。
类库参考
CodeIgniter\Database\BaseResult
getResult
([$type = 'object'])
参数: | $type (string) – 要求的结果类型 - array, object, 或 类名 |
---|---|
返回: | 包含查询到的行的数组 |
返回类型: | array |
它是这几种方法的包装: getResultArray()
, getResultObject()
和 getCustomResultObject()
。
用法: 详见 结果数组.
getResultArray
()
返回: | 包含查询到的行的数组 |
---|---|
返回类型: | array |
返回查询结果行的数组,每行都是关联数组。
用法: 详见 结果数组.
getResultObject
()
返回: | 包含查询到的行的数组 |
---|---|
返回类型: | array |
返回查询结果行的数组,每行都是 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
()
returns: | 列名称的数组 |
---|---|
rtype: | array |
返回一个包含结果集中字段名的数组。
getFieldData
()
返回: | 包含字段元数据的数组 |
---|---|
返回类型: | array |
生成一个包含字段元数据的 stdClass
对象的数组。
freeResult
()
返回类型: | void |
---|---|
释放一个结果集。
用法: 详见 结果处理辅助函数
.