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();