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
}

したがって、私が望むのは、2 つのオブジェクト$comment(コメント テーブルの列のみをオブジェクト プロパティとして持つ) と$userそのコメント用です。それを取得する簡単な方法はありますか?

これは一般的な質問であり、両方のテーブルのすべての列が必要であり、1 つのテーブルの列が他のテーブルの列と同じ名前を持つ場合があることに注意してください。

4

3 に答える 3

1

その foreach 内で、次のようなことができます。

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

}

また、Comment クラスでは、すべてのユーザー固有のデータを返すメソッドと、特定の Comment 情報用の別のメソッドを作成する必要があります。メソッドを呼び出すときに、現在のインスタンスからその情報をクリアすることもできます。
そうすれば、各コメントの配列として、個別の変数で必要なものを取得できます。

于 2012-09-17T20:26:39.563 に答える
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;
}
于 2012-09-19T10:08:09.960 に答える
0

ここで説明するアプローチの方が優れています: https://stackoverflow.com/a/10803244/385402遅延読み込み (オンデマンド) で関連オブジェクトを取得する必要があるためです。

于 2012-10-23T13:54:07.633 に答える