PDO FETCH_CLASS со связанными таблицами

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

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

а также

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

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

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

Мой 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 Я заполняю свой класс «Опубликовать» следующим образом:

  $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; 

Solutions Collecting From Web of "PDO FETCH_CLASS со связанными таблицами"

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

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

РЕДАКТИРОВАТЬ:

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

В этом случае просто используя стандартный метод arie 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 Пользователь на 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 Пользователь на post.user_id = user.id
       $ statement = $ db -> prepare ($ query);
         $ statement -> execute ();
         $ statement -> setFetchMode (PDO :: FETCH_CLASS, «Пользователь»);
         $ users = $ statement -> fetchAll ();
    

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