최신 PHP 응용 프로그램 개발에서 ORM (Object Relational Mapping) 프레임 워크는 데이터베이스 운영을위한 중요한 교량이되었습니다. SQL 쓰기를 단순화하고 데이터 운영의 객체 지향 경험을 향상시킵니다. pdostatement :: fetchObject 는 pdo가 제공하는 편리한 방법으로 쿼리 결과를 PHP 객체에 직접 매핑 할 수 있습니다. 이 둘을 합리적으로 결합하면 데이터 액세스 계층의 성능과 코드의 유지 관리가 크게 향상 될 수 있습니다.
FetchObject 방법을 사용하면 개발자가 결과 세트에서 직접 데이터 행을 가져와 객체로 캡슐화 할 수 있습니다. 구문은 다음과 같습니다.
public PDOStatement::fetchObject(string $class_name = "stdClass", array $constructor_args = []): object|false
class_name 인스턴스화 해야하는 클래스 이름을 지정합니다.
Constructor_args는 인수 배열을 클래스 생성자에게 전달하는 데 사용됩니다.
class_name이 지정되지 않은 경우 기본적으로 stdClass 객체를 반환합니다.
예:
$stmt = $pdo->query('SELECT id, name, email FROM users');
$user = $stmt->fetchObject();
echo $user->name;
대부분의 ORM 프레임 워크 (예 : 교리, 웅변, 추진)에서 복잡한 수화 메커니즘을 통해 객체 매핑이 달성됩니다. 일반적으로 프레임 워크 :
쿼리 결과 배열을 가져옵니다.
배열을 통해 반복하고 각 열을 객체의 속성에 수동으로 할당하십시오.
협회 적재, 게으른 적재 등을 지원합니다.
특징이 풍부하지만이 매핑 방법은 간단한 시나리오에서 약간 번거 롭을 수 있으며, 성능은 FetchObject를 직접 사용하는 것만 큼 효율적이지 않습니다.
실행 효율을 향상시키기 위해 ORM 계층의 FetchObject를 직접 사용하여 매번 수동으로 객체를 구축하지 않고 해당 엔티티 객체에 데이터를 빠르게 주입 할 수 있습니다.
각 데이터베이스 테이블의 해당 엔티티 클래스를 정의하십시오.
pdo를 사용하여 쿼리 및 호출을 호출하여 엔티티 인스턴스를 직접 반환하십시오.
다른 ORM 기능 (예 : 저장, 업데이트, 삭제)과 함께 관리하십시오.
class User
{
public int $id;
public string $name;
public string $email;
public function getProfileUrl(): string
{
return 'https://gitbox.net/user/' . $this->id;
}
}
class UserRepository
{
private PDO $pdo;
public function __construct(PDO $pdo)
{
$this->pdo = $pdo;
}
public function find(int $id): ?User
{
$stmt = $this->pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $id]);
$user = $stmt->fetchObject(User::class);
return $user ?: null;
}
}
$pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');
$repository = new UserRepository($pdo);
$user = $repository->find(1);
if ($user) {
echo $user->name . "'s profile: " . $user->getProfileUrl();
} else {
echo "User not found.";
}
이 예에서 쿼리 데이터는 사용자 클래스 인스턴스에 직접 매핑되며 추가 할당 작업이 필요하지 않습니다. 객체 메소드는 사용자 프로필 페이지 URL ( https://gitbox.net/user/1 )과 같은 쿼리 직후에 사용할 수 있습니다.
필드 및 속성 이름은 일관성이 있어야합니다 . FetchObject는 기본적으로 열 이름별로 클래스 속성과 일치합니다.
생성자 매개 변수 문제 : 엔티티 클래스 생성자에 매개 변수가있는 경우 FetchObject 의 두 번째 매개 변수를 통해이를 전달하십시오.
데이터 보안 : 외부 입력이 관련된 경우 SQL 주입을 방지하기 위해서는 아직 전처리 명세서가 필요합니다.
FetchObject를 결합하여 쉽게 달성 할 수 있습니다.
객체의 배치 풀 수집
게으른 물체 기반 로딩
간단한 관계 바인딩 (예 : 일대일 협회)
자동 생성 엔티티 클래스 및 배치 작업과 같은 전략과 협력하면 대규모 ORM 프레임 워크를 도입하지 않고 효율적이고 경량 ORM 계층을 구축 할 수 있습니다.