使用Active Record在CodeIgniter中加入SQL

时间:2012-02-17 18:22:44

标签: php codeigniter activerecord

我试图绕过这个,但我好像是在圈子里。我正在尝试逐个列出用户主题,下面是属于该特定主题的引号。如果这是有道理的。

我有3张桌子,如下:

  

[USERS] user_id username

     

[主题] topic_id user_id topic_name

     

[QUOTES] quote_id topic_id quote_name

我希望能够在我的观点中做到这样的事情:

  

用户名:Thomas

     
    

主题1:无论

         

引言:一个引用,另一个引用和第三个引用,都属于主题1。

         

主题2:托马斯的另一个主题

         

引言:是的,好的,谢谢,我喜欢Stack Overflow,这些引用属于主题2.

  

但我无法让它发挥作用,我一直在尝试一切,包括奇怪的东西,如:

public function get_quotes()
{

    $this->db->select('*');
    $this->db->from('topics');
    $this->db->join('quotes', 'topic_id = quote_id');

    $query = $this->db->get();

    if($query->num_rows() > 0)
    {
        foreach ($query->result() as $row) {
            $data[] = $row;
        }
    }
    return $data;
}

这有点奇怪吗,我应该尝试使用'where'吗?类似的东西:

$this->db->where('user', $user_id);
$this->db->where('topic', $topic_id);
$this->db->where('quote', $quote_id);

我真的很感激我能得到的任何帮助,或只是一个手指指向正确的方向!

2 个答案:

答案 0 :(得分:10)

马上我会问“什么不起作用?”,其次我建议你运行探查器来向你展示正在生成的 EXACT SQL ,所以您可以对 ACTIVE QUERY 失败的位置进行有效评估。

要使用探查器,请将其粘贴到控制器中:

$this->output->enable_profiler(TRUE);

它将导致所有数据库调用,所有POST变量等的良好输出;
参考此处:http://codeigniter.com/user_guide/libraries/output.html

更新

因此,要完全按照您的意愿行事,您需要一个返回以下列的查询:

user_id, username, topic_id, topic_name, quote_id, quote_name

这是您想要的活动查询(如果足够清楚,您还可以使用方法链接):

$this->db->select('u.user_id, u.username, t.topic_id, t.topic_name, q.quote_id, q.quote_name');
$this->db->from('users u');
$this->db->join('topics t', 't.user_id = u.user_id'); // this joins the user table to topics
$this->db->join('quotes q', 'q.topic_id = t.topic_id'); // this joins the quote table to the topics table
$query = $this->db->get();

您的结果集将类似于:

user_id     | username  | topic_id  | topic_name    | quote_id  | quote_name
1           |Thomas     |1          |Whatever       |1          |One quote, anot...
2           |Ryan       |4          |Another...     |6          |To be or not to...

一旦你有了结果集,只需循环遍历数据输出它,并检查你是否有来自同一个人的多个引号(比如按user_id排序,如果它是同一个人就在第二个循环上做一个测试) ,否则输出新用户名。)

答案 1 :(得分:1)

如果您想要特定用户的所有引号:

$this->db->join('TOPICS t', 'u.user_id on t.user_id')
         ->join('QUOTES q', 't.topic_id on q.topic_id')
         ->where('u.user_id', $userId)
         ->get('USERS u');

// I always echo my queries when developing to make sure they are what i'm expecting
echo $this->db->last_query();

如果您想要所有用户的所有引号

$this->db->join('TOPICS t', 'u.user_id on t.user_id')
         ->join('QUOTES q', 't.topic_id on q.topic_id')
         ->get('USERS u');

echo $this->db->last_query();