11

2 つの php オブジェクトがあるとします。

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

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

すべての投稿には、データベース内の 1 人のユーザーに対する一意の制約があります。

すべての「投稿」属性に対して機能する 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 「Post」クラスに次のように入力します。

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

5 に答える 5

2

私が知る限り、PDO での直接サポートはありません。通常、ORM の責任であるクエリの結果から複雑なオブジェクト グラフを作成する必要がある場合。

この機能が必要な場合は、自分で何かを書くのではなく、DoctrineまたはPropelを使用することをお勧めします。他にも軽量のものがありますが、私はそれらの経験がありません。

編集:

他の人がそうするかもしれないと確信しているので、私はおそらく質問を誤解したと思います。本当の問題は、結合された列からオブジェクトを作成する方法ではなく、結合された列にアクセスする方法だったと思います。

PDO::FETCH_ASSOCその場合、PDO::FETCH_NUMERICまたはのような標準の arry fethc メソッドを使用するだけで、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
   */
}
于 2013-03-04T13:40:54.853 に答える
1

OQ に対する実際の応答ではありませんが、Google に表示され続けるためです (はい、1 年以上経過していることはわかっています)。ループをスキップして各テーブルを個別にクエリする方が驚くほど高速であることがわかります。

    SELECT post.id、
           投稿テキスト、
           post.user_id、
    FROM POST INNER JOIN post.user_id = user.id のユーザー
      $statement = $db -> prepare($query);
        $ステートメント -> 実行();
        $statement -> setFetchMode(PDO::FETCH_CLASS, 'Post');
        $posts = $statement -> fetchAll();

    SELECT user.id,
           ユーザー名
    FROM POST INNER JOIN post.user_id = user.id のユーザー
      $statement = $db -> prepare($query);
        $ステートメント -> 実行();
        $statement -> setFetchMode(PDO::FETCH_CLASS, 'User');
        $users = $statement -> fetchAll();
    
于 2014-08-15T07:36:06.467 に答える
0

複数のテーブルを操作する場合は、PDO::FETCH_NAMED を使用してください。または、PDO::ATTR_FETCH_TABLE_NAMES を使用します。

于 2015-04-23T14:26:38.457 に答える