从Codeigniter查询中获取正确的数据?

时间:2014-02-26 13:37:17

标签: php mysql arrays codeigniter

我正在尝试使用codeigniter活动记录从我的数据库中获取一个数组,这是我经常做的事情,但我目前在获取正确的数据时遇到了问题。

有4条记录应该从我的模型返回到我的控制器。目前,正在返回表中的所有记录。

我在查询中使用foreach循环,因为查询where / or_where子句可以是多个值。这就是问题所在,因为我认为它绕过了foreach并获得了所有记录,而没有查看where子句。

我的问题是关于第二个例子的问题似乎是什么?

WORKING

以下代码获取了应返回的所需4条记录:

public function get_most_relevant($user){

    $categories = $this->get_users_most_common_categories($user);

    $this->db->order_by('posts.date_created','DESC');
    $this->db->limit(25);
    $this->db->select('*');
    $this->db->from('posts');
    $this->db->select('posts.image_name as post_image');
    $this->db->select('posts.random_string as post_string');
    $this->db->select('posts.date_created as post_creation');
    $this->db->join('users', 'posts.user_string = users.random_string','left'); 
    $this->db->where('category_string', 'cCU8oEQHYLWP');
    $this->db->or_where('category_string', '8RfRDWrG5QB7');

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

    return $posts;

}

不工作

以下代码获取表格中的所有记录:

似乎绕过foreach并直接转到get()

public function get_most_relevant($user){

    $categories = $this->get_users_most_common_categories($user);
    $i = 0;

    $this->db->order_by('posts.date_created','DESC');
    $this->db->limit(25);
    $this->db->select('*');
    $this->db->from('posts');
    $this->db->select('posts.image_name as post_image');
    $this->db->select('posts.random_string as post_string');
    $this->db->select('posts.date_created as post_creation');
    $this->db->join('users', 'posts.user_string = users.random_string','left'); 

    foreach($categories->result_array() as $category){
        if($i == 0){
            $this->db->where( array('category_string' => $category['category_string'], 'published' => '1') );
        }else{
            $this->db->or_where( array('category_string' => $category['category_string'], 'published' => '1') );
        }   
        $i++;
    }

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

    return $posts;

}

$ this-> get_users_most_common_categories($ user)代码

public function get_users_most_common_categories($user){

    $categories = $this->db->query("SELECT category_string, COUNT(category_string) AS category_occurence FROM views WHERE user_string = '".$user."' OR ip_address = '".$user."' GROUP BY category_string ORDER BY category_occurence DESC");

    return $categories;

}

$ this-> get_users_most_common_categories($ user)return

Array
(
[0] => Array
    (
        [category_string] => cCU8oEQHYLWP
        [category_occurence] => 3
    )

[1] => Array
    (
        [category_string] => 8RfRDWrG5QB7
        [category_occurence] => 1
    )

)

QUERY OUTPUT

SELECT *,postsimage_name作为post_image,postsrandom_string作为post_string,postsdate_created作为post_creation FROM({ {1}})LEFT JOIN posts ON usersposts = user_stringusers WHERE random_string ='cCU8oEQHYLWP'和{{1 }} ='1'或category_string ='8RfRDWrG5QB7'或published ='1'ORDER BY category_stringpublished DESC LIMIT 25

感谢您的帮助,我们非常感谢。

2 个答案:

答案 0 :(得分:1)

您可以做的一件事是找出查询中出错的地方是使用CI DB驱动程序的 last_query 功能。它返回最后运行的SQL字符串。然后,您可以将该查询执行到数据库客户端并进行调整,直到获得所需的结果。

$posts = $this->db->get();
$sql = $this->db->last_query();
echo $sql;

答案 1 :(得分:1)

这可能是一个错误。您可以尝试将该部分查询编写为一个字符串,您可以将其传递给whereor_where

foreach($categories->result_array() as $category){
    $query = "(category_string = ".$category['category_string']." AND published = '1')";

    if($i == 0){
        $this->db->where($query);
    }else{
        $this->db->or_where($query);
    }   
    $i++;
} 

http://ellislab.com/codeigniter/user-guide/database/ ... - 请参阅第4部分自定义字符串

的位置