Codeigniter 无法使用连接方法从数据库表中删除行

Posted

技术标签:

【中文标题】Codeigniter 无法使用连接方法从数据库表中删除行【英文标题】:Codeigniter cannot delete rows from database table using join method 【发布时间】:2014-12-22 17:43:56 【问题描述】:

我想从‘table1’中删除那些 (user_id = 5) 的行,但我应该检查那些帖子’(title = table2 中的 title1)。我使用 Codeigniter,但在尝试删除时出现此错误:'不允许删除,除非它们包含“where”或“like”子句。'请您帮我检查一下我的代码有什么问题。

table1:

table2:

public function delete($title, $user_id) 

    $this->db->select('table1.*');
    $this->db->from('table1','table2');   
    $this->db->where('table1.user_id', $user_id); 
    $this->db->where('table2.title', $title);
    $this->db->join('table2','table1.post_id=table2.post_id');

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

        if ($query && $query->num_rows() > 0) 

    $this->db->delete('table1.*');
    $this->db->from('table1','table2');   
    $this->db->where('table1.user_id', $user_id); 
    $this->db->where('table2.title', $title);
    $this->db->join('table2','table1.post_id=table2.post_id');
    return true;
             
    else 
    return false;
    

    

【问题讨论】:

使用子查询:***.com/questions/6047149/… 【参考方案1】:

利用子查询。

示例

#Create where clause
$this->db->select('id');
$this->db->from('table2');
$this->db->where('table2.title', $title);
$where_clause = $this->db->get_compiled_select();

#Create main query
$this->db->where('table1.user_id', $user_id); 
$this->db->where("`id` NOT IN ($where_clause)", NULL, FALSE);
$this->db->delete('table1'); 

参考文献

从这里被盗:https://***.com/a/16303021/1275832 关于子查询:http://www.mysqltutorial.org/mysql-subquery/ 编译选择:https://github.com/NTICompass/CodeIgniter-Subqueries

【讨论】:

感谢您的回答。还有另一种方法吗?因为我在 Codeigniter 文档中没有找到 get_compiled_select() 方法。【参考方案2】:

运行第一个查询后,您将获得必须删除的用户集。 运行这个 set throw foreach 循环以获取用户 ID 和您必须删除到数组的帖子。

  $user_array = array();
  $post_array = array();

  foreach($query->result() as $query) 
  
      $user_array[$query->user_id] = $query->user_id;
      $post_user[$query->post_id] = $query->post_id;
  

然后

  this->db->where_in('user_id', $user_array)->delete('table1');
  this->db->where_in('post_id', $post_array)->delete('table2');

我知道这不是最好的决定。但我认为这是最容易理解的。

【讨论】:

【参考方案3】:

您可以使用以下代码从表中删除数据,因为当您从多个表中删除多个数据时,codeigniter 会忽略连接。

$sql = "DELETE t1 FROM table1 t1
  JOIN table2 t2 ON t1.thing_id = t2.id
  WHERE t2.otherthing_id = ?";
$this->db->query($sql, array($id));

【讨论】:

【参考方案4】:

JOINS 用于从数据库中获取数据,而不是用于删除数据,如果您想使用单个查询从多个表中删除数据,那么您需要在 MySQl 中使用 cascading,这样您也可以删除数据来自与当前表相关的其他表。

【讨论】:

以上是关于Codeigniter 无法使用连接方法从数据库表中删除行的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 sqlsrv 从 CodeIgniter 连接 SQL 数据库

如何使用 join codeigniter 从另一个表中获取值

在连接中获取多行(codeigniter)

无法使用 PHP 和 Codeigniter 从 PHP Azure 连接到 SQL Server Azure

使用 PHP/CodeIgniter 从具有多对多关系的两个表中显示数据

Codeigniter - 如何内连接?