2011-12-03 8 views
21

Sto scrivendo il mio proprio ORM usando PDO. La mia domanda è se è possibile forzare il metodo PDOStatement::fetchAll() per restituire l'array di oggetti di stdClass? Per esempio:Come forzare PDOStatement-> fetchAll per restituire l'array di oggetti?

$result = $q->fetch_all(/* some magic here */); 
print_r($result); 

dovrebbe stampare qualcosa di simile:

Array 
(
    [0] => stdClass Object 
     (
      [NAME] => pear 
      [COLOUR] => green 
     ) 

    [1] => stdClass Object 
     (
      [NAME] => watermelon 
      [COLOUR] => pink 
     ) 

) 

È questo posible? NOME e COLORE sono ovviamente nomi di colonne. Ho letto la documentazione ma non ho trovato nulla di interessante.

+0

Non credo di leggere la documentazione con sufficiente chiarezza: "PDO :: FETCH_OBJ: restituisce un oggetto anonimo con nomi di proprietà che corrispondono ai nomi delle colonne visualizzate nel risultato impostare " –

risposta

44

Usa $result = $q->fetchAll(PDO::FETCH_OBJ);

+1

Oh mio. Mi manca questo nella documentazione. Ho pensato che si tratta solo del primo livello (array nel mio caso). Grazie. – Elektryk

+1

Niente, ma il PDO ha diverse modalità, anche definire un nome di un oggetto definito getter, vedere PDO :: FETCH_CLASS –

+1

È una buona pratica quando si dimostra una funzionalità documentata come un flag per un argomento di funzione per aggiungere un collegamento alla pagina della documentazione che menziona questo flag o copia e incolla i bit necessari per i documenti stessi. –

0

Si dovrebbe anche essere in grado di effettuare le seguenti operazioni:

$stmt->setFetchMode(PDO::FETCH_OBJ); //set the mode for all fetch request 

Con ogni successiva richiesta fetch è possibile omettere in modo esplicito specificando la modalità.

$stmt->setFetchAll(); //returns an array of objects 
8

Questo lo farà:

<?php 
$sth = $dbh->prepare("SELECT name, colour FROM fruit"); 
$sth->execute(); 

$result = $q->fetchAll(PDO::FETCH_OBJ); 
//$result contains an array of stdObjects 
?> 

Tuttavia ancora più interessante modo è quello di ottenere DOP istanziare la propria classe e popolare le proprietà per voi:

Esempio # 4 Instantiating una classe per ogni risultato

L'esempio seguente mostra il comportamento il nostro dello stile di recupero PDO :: FETCH_CLASS.

<?php 
class fruit { 
    public $name; 
    public $colour; 
} 

$sth = $dbh->prepare("SELECT name, colour FROM fruit"); 
$sth->execute(); 

$result = $sth->fetchAll(PDO::FETCH_CLASS, "fruit"); 
//$result contains an array of fruit objects 
?> 

Fonte: http://www.php.net/manual/en/pdostatement.fetchall.php

Problemi correlati