【问题标题】:How to implement "WHERE NOT IN" query into Codeigniter Active records?如何在 Codeigniter 活动记录中实现“WHERE NOT IN”查询?
【发布时间】:2016-05-03 14:00:53
【问题描述】:

我有一个 MySQL 查询是这样的:

SELECT * FROM tbl_post WHERE tbl_post.post_id NOT IN 
(SELECT tbl_readsave.post_id FROM tbl_readsave)

我想把它转换成Codeigniter Active记录,所以我使用了以下代码段:

    $this->db->select('tbl_readsave.post_id');
    $queryReadSave = $this->db->get('readsave');
    $this->db->where_not_in('post_id', $queryReadSave->result_array());
    $queryNewPost = $this->db->get('readsave');
    if($queryNewPost->num_rows()>0)
    {
        return $queryNewPost->result_array();
    }
    else
        return false;

但是,代码向我抛出了一个错误,如下所示:-

Error Number: 1054

Unknown column 'Array' in 'where clause'

SELECT * FROM (`tbl_readsave`) WHERE `post_id` NOT IN (Array)

Filename: /var/www/html/teamF/tharjumal/models/webservice_model.php

Line Number: 28

如何将上述查询转换为 Codeigniter Active Records 格式?

【问题讨论】:

  • 检查你的表名是readsavetbl_readsave
  • 实际上我已经在 database.php 文件中设置了 tbl 前缀。所以'post'意味着'tbl_post'

标签: php mysql codeigniter


【解决方案1】:

$queryReadSave->result_array() 返回一个数组数组。你不能在where_not_in中使用它。

您需要对其进行循环并创建一个包含您(不)想要的 ID 的平面数组。

$this->db->select('post_id');
$queryReadSave = $this->db->get('readsave');

$postIDs = $queryReadSave->result_array();

$this->db->where_not_in('post_id', array_column($postIDs, 'post_id'));
$queryNewPost = $this->db->get('post');

array_column() 仅存在于 PHP 5.5+ 中。如果您使用的是较低版本,则需要执行以下操作:

$this->db->select('post_id');
$queryReadSave = $this->db->get('readsave');

$postIDs = array_map(function($a){
    return $a['post_id'];
}, $queryReadSave->result_array());

$this->db->where_not_in('post_id', $postIDs);
$queryNewPost = $this->db->get('post');

附:你的第二张桌子叫post,对吧?您需要更新查询以使用正确的表。

更新:您的原始查询使用了 CodeIgniter 本身不支持的 子查询。如果您想将这一切作为一个查询来尝试,您可以使用我创建的子查询库 (https://github.com/NTICompass/CodeIgniter-Subqueries)。

$this->db->select('*');
$this->db->from('post');

$sub = $this->subquery->start_subquery('where_in');
$sub->select('post_id')->from('readsave');

$this->subquery->end_subquery('post_id', FALSE);
$queryNewPost = $this->db->get();

【讨论】:

  • 太棒了!不过有一个小问题。假设我们在“readsave”中没有数据,那么我就会出错。如果“readsave”中没有数据,则应该显示“post”表中的所有帖子。
  • @Saswat:然后检查是否为$queryReadSave->num_rows() > 0,如果是true,则仅添加where_not_in
  • OK.... 但是,如果我编写原始查询,如 $this->db->query("SELECT * FROM tbl_post WHERE tbl_post.post_id NOT IN (SELECT tbl_readsave.post_id FROM tbl_readsave)" ) 我得到了预期的结果...不能用 AR 来实现吗?
  • @Saswat:有点。它使用 子查询,CodeIgniter 本身并不支持该子查询。我创建了一个库来实现这个,如果你想试试:github.com/NTICompass/CodeIgniter-Subqueries
【解决方案2】:

试试下面的代码:

$read_post_id = [];

$queryReadSave = $this->db->select('post_id')->get('tbl_readsave')->result_array();

if(count($queryReadSave) > 0){

     foreach($queryReadSave as $row){

        $read_post_id[] = $row['post_id']; // add each post id to the array
     }

}

$this->db->select('*');

if(!empty($read_post_id)) $this->db->where_not_in('post_id',$read_post_id);

$post = $this->db->get('tbl_post');

print_r($post->result_array());

exit;

【讨论】:

    猜你喜欢
    • 2015-05-10
    • 2016-03-10
    • 2012-04-09
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    相关资源
    最近更新 更多