2013-03-04 135 views
8

比方说,我有2个PHP对象:与连接表PDO FETCH_CLASS

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

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

每一个岗位有1个用户在数据库中的唯一约束。

我想用PDO“FETCH_CLASS”方法将数据填充到“Post”对象中,该方法适用于所有“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 

谢谢!

UPDATE:

ATM我补我的“邮报”级这样的:

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

那么,如何将不得不改变,对于又充盈着其他类“用户”?

SOLUTION:

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

你的问题帮了很多!谢谢! – 2017-01-28 09:38:09

回答

2

即使世界就我所知在PDO直接的支持。通常,如果您需要根据查询的结果创建复杂的对象图表,那么ORM的职责就是这样。

如果您需要此功能,我建议您使用DoctrinePropel而不是自己写点东西。还有其他人可能更轻,但我没有与他们的经验。

编辑:

我想,也许我误解了这个问题作为即时通讯相信其他人可能。我认为真正的问题是如何访问连接的列,而不是如何从它们创建对象。

在这种情况下,只需使用标准arry fethc方法(如PDO::FETCH_ASSOC,PDO::FETCH_NUMERICPDO::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 
    */ 
} 
+0

谢谢。ATM我认为如果这太“复杂”,我应该远离PDO。没有简单的连接,哪些应用程序甚至存在? – 2013-03-04 13:44:36

+0

我不明白什么是如此复杂,特别是考虑到唯一的其他选项是'mysqli',它更难以使用和更详细。既不支持从联合查询结果中“补充”复杂的关系。 – prodigitalson 2013-03-04 13:50:19

+0

我不确定是否正确理解您的评论。你是否同意PDO应该支持?当不使用FETCH_CLASS时它是否支持它?我会考虑,现在... – 2013-03-04 13:54:40

1

没有真正的OQ的响应,而是因为它不断出现在谷歌(是的,我一岁的知道它的结束)。您会发现,仅仅跳过循环并单独查询每个表的速度会快得惊人。

 

    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(); 
0

也许使用PDO :: FETCH_NAMED如果你工作的多个表。或者使用PDO :: ATTR_FETCH_TABLE_NAMES。