使用Codeigniter查询朋友/博客数据库

时间:2014-04-25 12:22:02

标签: php sql codeigniter relation

我正在制作一个社交媒体类型的网站,人们可以发布消息并成为朋友等。

所以我有一个包含下表的数据库。

+-----+-----------+----------+----------+--------+
| id  | Bevriend  | UserID1  | UserID2  | vType  |
+-----+-----------+----------+----------+--------+
|  1  |        1  |       1  |       3  |      0 |
+-----+-----------+----------+----------+--------+

博客

+-----+----------------+-------+---------+
| id  |     title      | text  | userid  |
+-----+----------------+-------+---------+
|  1  | My first entry | Test  |       1 |
+-----+----------------+-------+---------+

我想写一个类别的查询,只能从我和我的朋友那里获取博客文章。 只要UserID1或UserID2包含来自我的会话的用户ID并且在数据库中,名为“Bevriend”的位设置为1就应该获取记录。

我很遗憾,如果我需要向您提供更多信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

我给你一个可能有帮助的查询。它只需要朋友发布的博客项目,而不是当前用户。您的查询应该如下(不包括当前用户是作者的博客帖子):

SELECT
    b.*
FROM Blog b
INNER JOIN Friends f ON (b.userid = f.UserID1 OR b.userid = f.UserID2)
WHERE
    f.Bevriend = 1
AND
(
    b.userid = f.UserID1 AND f.UserID2 = '{$currentUserID}'
OR
    b.user_id = f.UserID2 AND f.UserID1 = '{$currentUserID}'
)

我们在这里做的是以这样的方式加入表格,UserID1UserID2显示为博客记录“所有者”。然后在where子句中我们说只给我这些博客记录,其中所有者是我的朋友而不是我 ,每列UserID1和{{1 }}

这应该与CI一样(包括当前用户是作者的博客文章):

UserID2

您可以使用GROUP BY或DISTINCT调整要检索的列,排序和删除重复项。我们在此处运行自定义查询,因为当查询变得更复杂时,使用$currentUserID = (int) $this->session->userdata('userID'); $page = (int) $this->input->get('page'); // example retrieving of desired page num $pagesize = (int) $this->config->item('blog_pagesize'); // example retrieving of pagesize // Prevent unexpected behavior if(0 >= $page) $page = 1; // Prevent unexpected behavior if(0 >= $pagesize) $pagesize = 20; // If config is wrong we ensure it will continue to work // Additional page checks go here... $query = $this->db->query(' SELECT b.* FROM Blog b INNER JOIN Friends f ON (b.userid = f.UserID1 OR b.userid = f.UserID2) WHERE f.Bevriend = 1 AND ( f.UserID2 = ? OR UserID1 = ?) LIMIT ?, ? ', array($currentUserID, $currentUserID, ($page - 1) * $pagesize, $pagesize)); foreach ($query->result() as $row) { echo $row->id; echo $row->title; echo $row->text; } // Clean up at the end $query->free_result(); $this->db->select$this->db->from$this->db->join等更加清晰。如果你使用它们,你必须传递第三个参数$this->db->where来禁用每个逃脱的函数,它看起来像“丑陋的代码”。

您无法通过true直接使用自定义查询分页。这是因为它是CI查询,但不是活动记录。下面我将查询翻译成活动记录。

使用默认CI活动记录功能:

$this->db->query

上面的例子应该可以让你使用默认的分页,虽然我觉得它不是很有用和灵活。