Codeigniter - 从单个查询创建两个或多个结果对象

时间:2012-09-17 15:18:21

标签: php database codeigniter mysqli

请看这段代码:

$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(只有来自comments表的列作为对象属性)和$user用于该注释。 有没有简单的方法可以解决这个问题?

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

3 个答案:

答案 0 :(得分:1)

在那个foreach中你可以做这样的事情:

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

}

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

答案 1 :(得分:0)

我发现解决方案对我来说非常好。我需要的一切就是使用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;
}

答案 2 :(得分:0)

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