PHP PDO fetchAll, PDO :: FETCH_CLASS y se une

Tengo un problema en el siguiente código:

$query = 'SELECT user.id as id, pet.name as name FROM user 
          LEFT JOIN pet on pet.user_id = user.id
          WHERE user.id = 15';

$result = $pdo->query($query); 

Este código producirá algo similar a esto:

***************
| id | name   |
***************
| 1  | Mikey  |
***************
| 1  | Stewie |
***************
| 1  | Jessy  |
***************

Ahora, me gustaría usar PDO::FETCH_CLASS para conseguir un objeto. Sin embargo, este método, al menos para mí, funciona bien solo con simples SELECT declaraciones. Cuando tenga una declaración de unión, buscará todo en una sola clase. En otras palabras:

$user = $result->fetchAll(PDO::FETCH_CLASS, 'User');
echo $user->name; // this will print the pet name (which is weird)

Por lo tanto, me gustaría tener algo similar:

$pets = $user->pets; // an array holding Pet Objects 
foreach ($pets as $pet)
   echo $pet->name . "-"; 

que producirá:

Mikey - Stewie - Jessy -

¿Cómo puedo conseguir esto?

preguntado el 08 de noviembre de 11 a las 15:11

2 Respuestas

No puede confiar en que PDO haga el trabajo por usted. PDO no tiene forma de saber de dónde provienen las columnas del conjunto de datos y, obviamente, no puede averiguar dónde desea volcar los datos.

La respuesta más simple es que debes escribir tu propio código. Obtenga filas como matrices y complete sus clases con ellas como siempre se ha hecho ;-)

La técnica que describe es ORM (Mapeo relacional de objetos). Hay algunas bibliotecas de terceros que lo implementan, como Doctrina or Impulsar.

respondido 08 nov., 11:21

Abrí una función muy pequeña que transformará los resultados combinados en una jerarquía. Esto evita el uso de ORM pesados ​​si solo necesita esta pequeña función. https://github.com/afilina/nestedsql

Le darías una declaración como esta:

SELECT album.id AS albums__id, photo.id AS albums__photos__id
FROM album
LEFT JOIN photo ON photo.album_id = album.id;

y producirá algo así:

stdClass Object
(
    [albums] => Array
        (
            [1] => stdClass Object
                (
                    [id] => 1
                    [photos] => Array
                        (
                            [1] => stdClass Object
                                (
                                    [id] => 1
                                )
                        )
                )
        )
)

Opcionalmente, puede reemplazar stdClass por sus propias clases.

Respondido 02 Jul 15, 23:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.