クエリ結果の生成
クエリ結果を生成する方法はいくつかあります。
結果配列
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);
2 番目の文字列パラメーターを追加することもできます。これは、行をインスタンス化するためのクラスの名前です。
<?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
カスタム結果オブジェクト
getResult()
および getResultArray()
メソッドで許可されているように、結果を stdClass
または配列の代わりにカスタムクラスのインスタンスとして返すことができます。クラスがまだメモリにロードされていない場合、オートローダーがロードを試みます。オブジェクトには、データベースから返されたすべての値がプロパティとして設定されます。これらが宣言されていて、パブリックでない場合は、設定できるように __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};
}
}
}
以下に示す 2 つのメソッドに加えて、次のメソッドもクラス名を取得して、結果を次のように返すことができます。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()
クエリ結果から単一の行を返します。最初のパラメータは結果の行番号です。2番目のパラメータはインスタンス化するクラス名です。
例
<?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
) – 返されるクエリ結果の行のインデックス :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
) – リクエストされた結果の型 - 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
結果セットを解放します。
使用方法:結果ヘルパーメソッドを参照してください。