Mysql
 sql >> Base de données >  >> RDS >> Mysql

PDO FETCH_CLASS avec tables jointes

Il n'y a pas de support pour le directement dans PDO pour autant que je sache. Généralement, si vous devez créer un graphique d'objets complexes à partir du résultat d'une requête, c'est la responsabilité d'un ORM.

Si vous avez besoin de cette fonctionnalité, je vous recommande d'utiliser Doctrine ou Propulser au lieu d'écrire quelque chose vous-même. Il y en a d'autres aussi qui peuvent être plus légers, mais je n'ai aucune expérience avec eux.

MODIF :

Je pense que j'ai peut-être mal compris la question comme je suis sûr que d'autres pourraient le faire. Je pense que la vraie question était de savoir comment accéder aux colonnes jointes, pas nécessairement comment créer un objet à partir d'elles.

Dans ce cas, utilisez simplement une méthode standard arry fethc telle que PDO::FETCH_ASSOC , PDO::FETCH_NUMERIC ou PDO::FETCH_BOTH vous donnera toutes les colonnes que vous avez interrogées.

Donc, si vous voulez transformer cela en un "graphique d'objets", vous devez le faire manuellement et non en utilisant PDO::FETCH_CLASS .

Par exemple :

//$db is pdo:
// also notice im aliase the columns prefixing the name so that we can tell what belongs to
// post and what belongs to user, an alternative approach would be to use FETCH_NUMERIC,
// which just uses the column positions from the seelct statement as the keys
// so in this case post.id would be in the array as key 0, and user.name would be in the
// array as key 4
$stmt = $db->prepare('SELECT post.id as p_id, 
       post.text as p_text, 
       post.user_id as p_user_id, 
       user.id as u_id, 
       user.name as u_name
FROM POST INNER JOIN User on post.user_id = user.id');

$stmt->execute();

while (($row = $stmt->fetch(PDO::FETCH_ASSOC)) !== false) {
   print_r($row);
   /* will output:
      Array (
         'p_id' => 'value'
         'p_text' => 'value'
         'p_user_id' => 'value'
         'u_id' => 'value',
         'u_name' => 'value'
      )
   So now you need to decide how to create your objects with the information returned
   */
}