我正在尝试使用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 *,posts
。image_name
作为post_image,posts
。random_string
作为post_string,posts
。date_created
作为post_creation FROM({ {1}})LEFT JOIN posts
ON users
。posts
= user_string
。users
WHERE random_string
='cCU8oEQHYLWP'和{{1 }} ='1'或category_string
='8RfRDWrG5QB7'或published
='1'ORDER BY category_string
。published
DESC LIMIT 25
感谢您的帮助,我们非常感谢。
答案 0 :(得分:1)
您可以做的一件事是找出查询中出错的地方是使用CI DB驱动程序的 last_query 功能。它返回最后运行的SQL字符串。然后,您可以将该查询执行到数据库客户端并进行调整,直到获得所需的结果。
$posts = $this->db->get();
$sql = $this->db->last_query();
echo $sql;
答案 1 :(得分:1)
这可能是一个错误。您可以尝试将该部分查询编写为一个字符串,您可以将其传递给where
和or_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部分自定义字符串
的位置