0

请看这段代码:

$query = $this->db->query("SELECT * FROM comments c LEFT JOIN users u ON u.user_id = c.user_id");
foreach ($query->result('Comment') as $comment)
{
// $comment holds all data from both tables
}

所以,我想要的是有两个对象$comment(只有评论表中的列作为对象属性)和$user那个评论。有什么简单的方法可以得到吗?

请注意,这是一般问题,我需要两个表中的所有列,有时一个表中的列可以将名称作为其他表中的列。

4

3 回答 3

1

在该 foreach 中,您可以执行以下操作:

foreach ($query->result('Comment') as $comments)
{
    $comment[$comments->getCommentId()] = $comments->getCommentInfo();
    $user[$comments->getCommentId()] = $comment->getUserInfo();

}

在评论类上,您应该创建一个返回所有用户特定数据的方法和另一个用于特定评论信息的方法,您还可以在调用该方法时从当前实例中清除该信息。
这样,您将在单独的变量中获得您想要的内容,作为每个评论的数组。

于 2012-09-17T20:26:39.563 回答
0

我发现解决方案 whitch 现在对我来说非常有效。我所需要的就是使用 PDO。这是我现在的代码:

$this->db->conn_id->setAttribute(PDO::ATTR_FETCH_TABLE_NAMES, 1);
$query = $this->db->query("SELECT * FROM comments c LEFT JOIN users u ON u.user_id = c.user_id");
foreach ($query->result_array() as $row)
{
    $comment = row2object($row, 'Comment', 'c');
    $comment->user = row2object($row, 'User', 'u');

    $comments[] = $comment;
}

和 row2object() 助手:

/**
 * Row to object
 * application/helpers/row2object_helper.php
 *
 * @param array $row
 * @param string $class
 * @param string $from_table alias of table name
 */
function row2object(&$row, $class, $from_table)
{
    $object = new $class;

    foreach($row as $key => $value)
    {
        list($table, $column) = explode(".", $key);

        if($table == $from_table)
        {
            $object->{$column} = $value;
            unset($row[$key]);
        }
        elseif ($table == "" && substr($key, 1, strlen($from_table)) == $from_table)
        {
            $column = substr($key, strlen($from_table) + 2);
            $object->{$column} = $value;
            unset($row[$key]);
        }
    }

    return $object;
}
于 2012-09-19T10:08:09.960 回答
0

这里描述的方法更好:https ://stackoverflow.com/a/10803244/385402因为它涉及通过延迟加载(按需)获取相关对象

于 2012-10-23T13:54:07.633 回答