DOP FETCH_CLASS

Resumo : neste tutorial, você aprenderá como usar o PDO::FETCH_CLASSmodo para buscar dados em um objeto de uma classe.

Introdução ao modo PDO::FETCH_CLASS

Suponha que você tenha a seguinte bookstabela 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 bookstabela pode ser mapeada para uma instância da Bookclasse.

Para selecionar dados da bookstabela e mapear as colunas para as propriedades de um Bookobjeto, você pode usar o PDO::FETCH_CLASSmodo. 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 bookdbbanco de dados usando o connect.phpscript:

$pdo = require 'connect.php';Linguagem de código:  PHP  ( php )

Em seguida, selecione uma linha com id 1 da bookstabela:

$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_CLASSe passe o Booknome 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 bookstabela nas propriedades da Bookclasse:

$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_CLASSusa as seguintes regras ao atribuir valores de coluna às propriedades do objeto:

  • Se a Bookclasse tiver uma propriedade igual ao nome da coluna, ela atribuirá o valor da coluna à propriedade.
  • Se a Bookclasse 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_CLASSmodo para selecionar dados da bookstabela e retornar uma matriz de Bookobjetos:

<?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 bookstabela e retornar uma nova instância da Bookclasse:

<?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 Bookclasse possui quatro propriedades privadas e um __set() método mágico vazio .

Como as propriedades book_id, title, isbne published_datecorrespondem às colunas da linha selecionada, o PHP atribui os valores das colunas a essas propriedades.

No entanto, a Bookclasse não possui a publisher_idpropriedade. Neste caso, o PDO chama o __set()método da Bookclasse.

Como o __set()método não possui lógica, o PDO não atribui o valor da publisher_idcoluna 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_CLASSwith 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_CLASSmodo 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_LATEpara chamar o construtor antes de atribuir valores de coluna às propriedades do objeto.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *