쿼리 결과 생성

쿼리 결과를 생성하는 방법에는 여러 가지가 있습니다.

결과 배열

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

다음을 사용하여 행을 인스턴스화하는 클래스 이름인 두 번째 String 매개변수를 추가할 수도 있습니다.

<?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 또는 배열 대신 사용자 정의 클래스의 인스턴스로 결과를 반환할 수 있습니다. 클래스가 아직 메모리에 로드되지 않은 경우 Autoloader는 해당 클래스를 로드하려고 시도합니다. 개체는 데이터베이스에서 반환된 모든 값을 속성으로 설정합니다. 이것이 선언되었고 비공개인 경우 이를 설정할 수 있도록 __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->getRow(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() 메서드에 대한 래퍼입니다.

사용법: 결과 배열을 참조하세요.

getResultArray()
반환:

가져온 행을 포함하는 배열

반환 형식:

array

쿼리 결과를 행 배열로 반환합니다. 여기서 각 행은 그 자체가 연관 배열입니다.

사용법: 결과 배열을 참조하세요.

getResultObject()
반환:

가져온 행을 포함하는 배열

반환 형식:

array

쿼리 결과를 행 배열로 반환합니다. 여기서 각 행은 stdClass 유형의 개체입니다.

사용법: stdClass 배열 가져오기를 참조하세요.

getCustomResultObject($className)
매개변수:
  • $className (string) – 결과 행의 클래스 이름

반환:

가져온 행을 포함하는 배열

반환 형식:

array

쿼리 결과를 행 배열로 반환합니다. 여기서 각 행은 지정된 클래스의 인스턴스입니다.

getRow([$n = 0[, $type = 'object']])
매개변수:
  • $n (int) – 반환할 쿼리 결과 행의 인덱스

  • $type (string) – 요청된 결과 유형 - 배열, 개체 또는 클래스 이름

반환:

요청된 행 또는 존재하지 않는 경우 null

반환 형식:

mixed

getRowArray(), getRowObject()getCustomRowObject() 메서드에 대한 래퍼입니다.

사용법: 결과 행을 참조하세요.

getUnbufferedRow([$type = 'object'])
매개변수:
  • $type (string) – 요청된 결과 유형 - 배열, 개체 또는 클래스 이름

반환:

결과 집합의 다음 행 또는 존재하지 않는 경우 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) – 다음에 반환될 결과 행의 인덱스

반환:

성공하면 참, 실패하면 거짓

반환 형식:

bool

내부 결과 행 포인터를 원하는 오프셋으로 이동합니다.

사용법: 결과 도우미 메서드를 참조하세요.

setRow($key[, $value = null])
매개변수:
  • $key (mixed) – 열 이름 또는 키/값 쌍의 배열

  • $value (mixed) – 열에 할당할 값이며, $key는 단일 필드 이름입니다.

반환 형식:

void

특정 열에 값을 할당합니다.

getNextRow([$type = 'object'])
매개변수:
  • $type (string) – 요청된 결과 유형 - 배열, 개체 또는 클래스 이름

반환:

결과 집합의 다음 행 또는 존재하지 않는 경우 null

반환 형식:

mixed

결과 집합에서 다음 행을 반환합니다.

getPreviousRow([$type = 'object'])
매개변수:
  • $type (string) – 요청된 결과 유형 - 배열, 개체 또는 클래스 이름

반환:

결과 집합의 이전 행 또는 존재하지 않는 경우 null

반환 형식:

mixed

결과 집합에서 이전 행을 반환합니다.

getFirstRow([$type = 'object'])
매개변수:
  • $type (string) – 요청된 결과 유형 - 배열, 개체 또는 클래스 이름

반환:

결과 집합의 첫 번째 행 또는 존재하지 않는 경우 null

반환 형식:

mixed

결과 집합의 첫 번째 행을 반환합니다.

getLastRow([$type = 'object'])
매개변수:
  • $type (string) – 요청된 결과 유형 - 배열, 개체 또는 클래스 이름

반환:

결과 집합의 마지막 행 또는 존재하지 않는 경우 null

반환 형식:

mixed

결과 집합의 마지막 행을 반환합니다.

getFieldCount()
반환:

결과 세트의 필드 수

반환 형식:

int

결과 집합의 필드 수를 반환합니다.

사용법: 결과 도우미 메서드를 참조하세요.

getFieldNames()
반환:

열 이름 배열

반환 형식:

array

결과 세트의 필드 이름을 포함하는 배열을 반환합니다.

getFieldData()
반환:

필드 메타데이터가 포함된 배열

반환 형식:

array

필드 메타데이터를 포함하는 stdClass 객체의 배열을 생성합니다.

getNumRows()
반환:

결과 세트의 행 수

반환 형식:

int

쿼리에서 반환된 행 수를 반환합니다.

freeResult()
반환 형식:

void

결과 세트를 해제합니다.

사용법: 결과 도우미 메서드를 참조하세요.