PDO FETCH CLASS с присоединенными таблицами

предположим, у меня есть 2 объекта php:

<?php
class Post {
    public $id;
    public $text;
    public $user_id;
}
?>

и

<?php
class User {
    public $id
    public $name
}
?>

каждая запись имеет уникальное ограничение с 1 Пользователем в базе данных.

Я хочу заполнить данные в"Post" -объект с помощью метода PDOs "FETCH_CLASS", который работает для всех атрибутов" Post", но как заполнить атрибуты в"User"?

мой SQL-оператор выглядит так:

SELECT post.id, 
       post.text, 
       post.user_id, 
       user.id, 
       user.name 
FROM POST INNER JOIN User on post.user_id = user.id

спасибо!

обновление:

ATM I заполните мой "пост" - класс следующим образом:

    $statement = $db -> prepare($query);
    $statement -> execute();
    $statement -> setFetchMode(PDO::FETCH_CLASS, 'Post');
    $posts = $statement -> fetchAll();

Итак, как бы мне изменить это для заполнения другого класса "пользователь"?

устранение:

$statement = $db -> prepare($query);
$statement -> execute();
$posts = array();
while (($row = $statement->fetch(PDO::FETCH_ASSOC)) !== false) {
    $post           = new Post();
    $post->id       = $row['post_id'];
    $post->text     = $row['post_text'];
    $post->created  = $row['post_created'];
    $post->image    = $row['post_image'];
    $post->url      = $row['post_url'];
    $post->weight   = $row['post_weight'];
    $post->likes    = $row['post_likes'];
    $user           = new User();
    $user->id       = $row['user_id'];
    $user->nickname = $row['user_nickname'];
    $user->created= $row['user_created'];
    $user->locked   = $row['user_locked'];
    $post->user     = $user;
    $posts[] = $post;
}
return $posts;

3 ответов


насколько мне известно, нет поддержки непосредственно в PDO. Обычно, если вам нужно создать сложный объектный граф из результата запроса, это ответственность ORM.

Если вам нужна эта функциональность, я рекомендую использовать доктрина или Propel в отличие от написания чем-то себя. Есть и другие, которые могут быть легче, но у меня нет опыта работы с их.

EDIT:

Я думаю, может быть, я неправильно понял вопрос, как я уверен, что другие могли бы. Я думаю, что реальный вопрос состоял в том, как получить доступ к Объединенным столбцам, а не в том, как создать объект из них.

в этом случае просто используя стандартный метод arry fethc, как PDO::FETCH_ASSOC, PDO::FETCH_NUMERIC или PDO::FETCH_BOTH даст вам все столбцы запроса.

поэтому, если вы хотите превратить это в "объектный граф", вы должны это сделать вручную не используя PDO::FETCH_CLASS.

например:

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

не совсем ответ для OQ, но потому, что он продолжает появляться в Google (Да, я знаю его более года). Вы обнаружите, что удивительно быстрее просто пропустить циклы и запросить каждую таблицу отдельно.


    SELECT post.id, 
           post.text, 
           post.user_id, 
    FROM POST INNER JOIN User on post.user_id = user.id
      $statement = $db -> prepare($query);
        $statement -> execute();
        $statement -> setFetchMode(PDO::FETCH_CLASS, 'Post');
        $posts = $statement -> fetchAll();

    SELECT user.id, 
           user.name 
    FROM POST INNER JOIN User on post.user_id = user.id
      $statement = $db -> prepare($query);
        $statement -> execute();
        $statement -> setFetchMode(PDO::FETCH_CLASS, 'User');
        $users = $statement -> fetchAll();
    

возможно, используйте PDO:: FETCH_NAMED, если вы работаете с несколькими таблицами. Или используйте PDO:: ATTR_FETCH_TABLE_NAMES.