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

Php 使用Codeigniter查询朋友/博客数据库,php,sql,codeigniter,relation,Php,Sql,Codeigniter,Relation,我正在制作一个类似于社交媒体的网站,在那里人们可以发布消息,成为朋友等等 因此,我有一个包含以下表格的数据库 朋友 +-----+-----------+----------+----------+--------+ | id | Bevriend | UserID1 | UserID2 | vType | +-----+-----------+----------+----------+--------+ | 1 | 1 | 1 | 3

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

因此,我有一个包含以下表格的数据库

朋友

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

我想写一个查询,只从我的朋友那里获取博客帖子。 只要UserID1或UserID2包含我会话中的userID,并且在数据库中,被称为“Bevriend”的位被设置为1,它就应该获得记录


我不知所措,如果我需要向您提供更多信息,请告诉我。

我正在向您提出一个可能会有所帮助的问题。它只接收好友发布的博客中的项目,而不接收当前用户发布的项目。您的查询应该如下所示(不包括当前用户为作者的博客帖子):

我们在这里所做的是以如下方式加入表:
UserID1
UserID2
显示为Blog记录“所有者”。然后在where子句中,我们说,对于每一列
UserID1
UserID2
,只给我这些博客记录,其中所有者是我的朋友而不是我

这应该类似于CI(包括当前用户为作者的博客帖子):

您可以使用GROUP BY或DISTINCT调整要检索、排序和删除重复的列。我们在这里运行自定义查询,因为当查询变得更复杂时,使用
$this->db->select
$this->db->from
$this->db->join
$this->db->where
,比使用
$this->db->where
等更干净。如果您使用它们,您必须传递第三个参数
true
,以禁用这些函数中的每一个转义,它看起来就像“丑陋的代码”

您不能通过
$this->db->query
将分页直接用于自定义查询。这是因为它是CI查询,但不是活动记录。下面我将查询转换为活动记录

要使用默认CI活动记录功能,请执行以下操作:

$results = $this->db->select('b.*')
     ->from('Blog b')
     ->join('Friends f', 'b.userid = f.UserID1 OR b.userid = f.UserID2')
     ->where('f.Bevriend', 1)
     ->where("(f.UserID1 = {$currentUserID} OR f.UserID2 = {$currentUserID})")
     ->group_by('b.id')
     //->get()
     //->results();

上面的示例应该允许您使用默认分页,尽管我发现它不是非常有用和灵活。

您应该将
{$currentUserID}
替换为
!此外,您使用的是单引号,因此
{$currentUserID}
无论如何都无法工作。非常感谢!只有几个问题,因为我也有一个分页的限制和开始,它们去哪里?我如何执行查询以将结果传递回视图?是的,因为我从纯SQL部分复制粘贴它。我已经为?写过了,它们在查询的最后。@user3518404,请参阅我编辑的文章中的LIMIT子句。这是示例代码。
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}'
)
$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();
$results = $this->db->select('b.*')
     ->from('Blog b')
     ->join('Friends f', 'b.userid = f.UserID1 OR b.userid = f.UserID2')
     ->where('f.Bevriend', 1)
     ->where("(f.UserID1 = {$currentUserID} OR f.UserID2 = {$currentUserID})")
     ->group_by('b.id')
     //->get()
     //->results();