Mysql
 sql >> Datenbank >  >> RDS >> Mysql

PDO FETCH_CLASS mit verknüpften Tabellen

Soweit mir bekannt ist, gibt es keine Unterstützung für das direkt in PDO. Wenn Sie aus dem Ergebnis einer Abfrage ein komplexes Objektdiagramm erstellen müssen, liegt dies in der Regel in der Verantwortung eines ORM.

Wenn Sie diese Funktionalität benötigen, empfehle ich die Verwendung von Doctrine oder Propel im Gegensatz dazu, etwas selbst zu schreiben. Es gibt auch andere, die leichter sein könnten, aber ich habe keine Erfahrung damit.

BEARBEITEN:

Ich glaube, vielleicht habe ich die Frage falsch verstanden, da ich mir sicher bin, dass andere es könnten. Ich denke, die eigentliche Frage war, wie man Zugriff auf die verbundenen Spalten erhält, nicht unbedingt, wie man daraus ein Objekt erstellt.

Verwenden Sie in diesem Fall einfach eine Standard-Arry-Fethc-Methode wie PDO::FETCH_ASSOC , PDO::FETCH_NUMERIC oder PDO::FETCH_BOTH gibt Ihnen alle Spalten, die Sie abgefragt haben.

Wenn Sie das also in einen "Objektgraphen" umwandeln möchten, müssen Sie es manuell tun, nicht mit PDO::FETCH_CLASS .

Zum Beispiel:

//$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
   */
}