쿼리 결과 생성
쿼리 결과를 생성하는 방법에는 여러 가지가 있습니다.
결과 배열
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
결과 세트를 해제합니다.
사용법: 결과 도우미 메서드를 참조하세요.