Resumo : neste tutorial, você aprenderá como usar o PDO::FETCH_CLASS
modo para buscar dados em um objeto de uma classe.
Introdução ao modo PDO::FETCH_CLASS
Suponha que você tenha a seguinte books
tabela no banco de dados:
CREATE TABLE IF NOT EXISTS books (
book_id INT AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
isbn VARCHAR(13) NULL,
published_date DATE NULL,
publisher_id INT NULL,
PRIMARY KEY (book_id),
CONSTRAINT fk_publisher FOREIGN KEY (publisher_id)
REFERENCES publishers (publisher_id)
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
E a Book
classe em PHP :
class Book
{
}
Linguagem de código: PHP ( php )
Cada linha da books
tabela pode ser mapeada para uma instância da Book
classe.
Para selecionar dados da books
tabela e mapear as colunas para as propriedades de um Book
objeto, você pode usar o PDO::FETCH_CLASS
modo. Por exemplo:
<?php
class Book
{
}
$pdo = require 'connect.php';
$sql = 'SELECT book_id, title, isbn, published_date
FROM books
WHERE book_id = :book_id';
$statement = $pdo->prepare($sql);
$statement->execute([':book_id' => 1]);
$statement->setFetchMode(PDO::FETCH_CLASS, 'Book');
$book = $statement->fetch();
var_dump($book);
Linguagem de código: PHP ( php )
Saída:
object(Book)#3 (4) {
["book_id"]=> string(1) "1"
["title"]=> string(43) "CISSP All-in-One Exam Guide, Eighth Edition"
["isbn"]=> string(13) "9781260142655"
["published_date"]=> string(10) "2018-09-28"
}
Linguagem de código: texto simples ( texto simples )
Como funciona.
Primeiro, defina uma classe chamada Book
:
class Book
{
}
Linguagem de código: PHP ( php )
Em seguida, conecte-se ao bookdb
banco de dados usando o connect.php
script:
$pdo = require 'connect.php';
Linguagem de código: PHP ( php )
Em seguida, selecione uma linha com id 1 da books
tabela:
$sql = 'SELECT book_id, title, isbn, published_date
FROM books
WHERE book_id = :book_id';
$statement = $pdo->prepare($sql);
$statement->execute([':book_id' => 1]);
Linguagem de código: PHP ( php )
Depois disso, defina o modo de busca como PDO::FETCH_CLASS
e passe o Book
nome da classe para o segundo argumento do setFetchMode()
método:
$statement->setFetchMode(PDO::FETCH_CLASS, 'Book');
Linguagem de código: PHP ( php )
Por fim, busque os dados da books
tabela nas propriedades da Book
classe:
$book = $statement->fetch();
Linguagem de código: PHP ( php )
Observe que se a classe Book não existir, o PDO retornará um array em vez de um objeto.
O PDO::FETCH_CLASS
usa as seguintes regras ao atribuir valores de coluna às propriedades do objeto:
- Se a
Book
classe tiver uma propriedade igual ao nome da coluna, ela atribuirá o valor da coluna à propriedade. - Se a
Book
classe não tiver nenhuma propriedade igual ao nome da coluna, o PHP chamará o método mágico__set()
. - Se a classe Book não tiver
__set()
método, o PHP criará uma propriedade pública com o valor derivado da coluna.
Retornando um array de objetos
O exemplo a seguir mostra como usar o PDO::FETCH_CLASS
modo para selecionar dados da books
tabela e retornar uma matriz de Book
objetos:
<?php
class Book
{
}
$pdo = require 'connect.php';
$sql = 'SELECT book_id, title, isbn, published_date
FROM books';
$books = $statement->query()->fetchAll(PDO::FETCH_CLASS, 'Book');
var_dump($books);
Linguagem de código: PHP ( php )
Atribuir propriedades de objeto
O exemplo a seguir ilustra como selecionar uma linha da books
tabela e retornar uma nova instância da Book
classe:
<?php
class Book
{
private $book_id;
private $title;
private $isbn;
private $published_date;
public function __set($name, $value)
{
// empty
}
}
$pdo = require 'connect.php';
$sql = 'SELECT
book_id,
title,
isbn,
published_date,
publisher_id
FROM books
WHERE book_id = :book_id';
$statement = $pdo->prepare($sql);
$statement->execute([':book_id' => 1]);
$statement->setFetchMode(PDO::FETCH_CLASS, 'Book');
$book = $statement->fetch();
var_dump($book);
Linguagem de código: PHP ( php )
Saída:
object(Book)#3 (4) {
["book_id":"Book":private]=> string(1) "1"
["title":"Book":private]=> string(43) "CISSP All-in-One Exam Guide, Eighth Edition"
["isbn":"Book":private]=> string(13) "9781260142655"
["published_date":"Book":private]=> string(10) "2018-09-28"
}
Linguagem de código: texto simples ( texto simples )
Neste exemplo, a Book
classe possui quatro propriedades privadas e um __set()
método mágico vazio .
Como as propriedades book_id
, title
, isbn
e published_date
correspondem às colunas da linha selecionada, o PHP atribui os valores das colunas a essas propriedades.
No entanto, a Book
classe não possui a publisher_id
propriedade. Neste caso, o PDO chama o __set()
método da Book
classe.
Como o __set()
método não possui lógica, o PDO não atribui o valor da publisher_id
coluna ao objeto Book.
Atribuindo propriedades do objeto e chamando o construtor
Por padrão, o PDO atribui valores de coluna às propriedades do objeto antes de chamar o construtor .
Para instruir o PDO a chamar o construtor antes de atribuir valores de coluna às propriedades do objeto, você combina o sinalizador PDO::FETCH_CLASS
with PDO::FETCH_PROPS_LATE
. Por exemplo:
<?php
class Book
{
public function __construct()
{
if (isset($this->isbn)) {
echo 'ISBN:' . $this->isbn;
}
echo 'ISBN has not assigned yet.';
}
}
$pdo = require 'connect.php';
$sql = 'SELECT book_id, title, isbn, published_date,
FROM books
WHERE book_id = :book_id';
$statement = $pdo->prepare($sql);
$statement->execute([':book_id' => 1]);
$statement->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE, 'Book');
$book = $statement->fetch();
var_dump($book);
Linguagem de código: PHP ( php )
Resumo
- Use o
PDO::FETCH_CLASS
modo de busca para retornar uma instância de uma classe mapeando os valores da coluna para as propriedades do objeto. - Use o
PDO::FETCH_PROPS_LATE
para chamar o construtor antes de atribuir valores de coluna às propriedades do objeto.