Codeigniterを使用すると、データベースの結果をオブジェクト(たとえば、モデルオブジェクト)として返すことができます。これにより、データの操作がはるかに簡単になります。Posts
テーブルに最初のクエリを発行posts.id
し、結果セットにフィールドを含め、Post_model
クラスの名前を$db->query->result()
関数に渡して、結果をクラスのインスタンスとして返すことをcodeigniterに通知できますPost_model
。
Post_model
次に、クラスのメソッドをGetCategories
bypost_id
およびGetComments
byで定義し、post_id
これらのメソッドを呼び出して、クエリから返され たそれぞれのコレクション$categories
とコレクションにデータを入力できます。$comments
Post_model
ここに例があります、私はそれが役立つことを願っています:
public class Post_model extends CI_Model
{
// All the properties in the Posts table, as well as a couple variables to hold the categories and comments for this Post:
public $id;
public $post_title;
public $post_content;
public $post_date;
public $username;
public $categories;
public $comments;
public function index_loop()
{
return $this->GetAllPosts();
}
// function to get all posts from the database, including comments and categories.
// returns an array of Post_model objects
public function GetAllPosts()
{
// define an empty array to hold the results of you query.
$all_posts = array();
// define your sql query. NOTE the POSTS.ID field has been added to the field list
$sql = "SELECT posts.id,
posts.post_title,
posts.post_content,
posts.post_date,
users.username
FROM posts LEFT JOIN users ON posts.user_id = users.user_id
ORDER BY posts.post_id DESC";
// issue the query
$query = $this->db->query($sql);
// loop through the query results, passing a string to result() which represents a class to instantiate
//for each result object (note: this class must be loaded)
foreach($query->result("Post_model") as $post)
{
$post->categories = $this->GetPostCategories($post->id);
$post->comments = $this->GetPostComments($post->id);
$all_posts[] = $post;
}
return $all_posts;
}
// function to return categories for a given post_id.
// returns an array of Category_model objects.
public function GetPostCategories($post_id)
{
$sql = "SELECT category.id, ... WHERE post_id = ?";
$query = $this->db->query($sql, array($post_id));
$categories = array();
foreach($query->result("Category_model") as $category)
{
$categories[] = $category;
}
return $categories;
}
// function to return comments for a given post_id.
//returns an array of Comment_model objects
public function GetPostComments($post_id)
{
$sql = "SELECT comment.id, ... WHERE post_id = ?";
$query = $this->db->query($sql, array($post_id));
$comments = array();
foreach($query->result("Comment_model") as $comment)
{
$comments[] = $comment;
}
return $comments;
}
}
次に、ビューで、result_arraysとしてではなくPost_modelオブジェクトとして$posts配列にアクセスできます。
<?php foreach($posts as $zz) { ?>
<div class="article">
<h2><?php echo $zz->post_title; ?></h2>
<p>Posted by <a href=""><?php echo $zz->username; ?></a> |
Filed under
<?php foreach($zz->categories as $category) {
echo '<a href="#">{$category->name}</a>, ';
}
?>
</p>
<p><?php echo $zz->post_content; ?></p>
<p><a href=>Read more</a> | <a href=>Comments (5)</a> | <?php echo $zz->post_date; ?></p>
</div> <?php } ?>
効率の問題に関しては、それは多くの要因に依存します(データベースはWebサーバーと同じマシンにありますか?投稿はいくつありますか?など)。通常、1つの大きなクエリは、いくつかの小さなクエリよりも高速に実行されますが、パフォーマンスの向上を求める価値があるかどうかを実際に判断するには、プロファイリングが必要になります。私は常に、複雑さを増すことを犠牲にして最適化するよりも、読みやすく理解しやすいコードを書こうとすることを好みます。