请看这段代码:
$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
用于该注释。 有没有简单的方法可以解决这个问题?
请注意,这是一般性问题,我需要两个表中的所有列,有时一个表中的列可以将名称作为其他表中的列。
答案 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因为它涉及使用延迟加载(按需)获取相关对象