Предположим, у меня есть 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;
Насколько мне известно, они не поддерживают прямо в 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.