クエリ結果の生成

クエリ結果を生成する方法はいくつかあります。

結果配列

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

結果セットを解放します。

使用方法:結果ヘルパーメソッドを参照してください。