CodeIgniter事务无法正常工作

时间:2017-09-10 21:08:22

标签: php codeigniter

我的模型中有这个函数应该在事务中运行两个查询,但是更新查询不起作用。

public function delete($id = null) 
{
    if($id) {
        $delete = "DELETE FROM borrowed_books 
        WHERE id = '$id'; ";

        $mod="UPDATE `books` b
              INNER JOIN `borrowed_books` a
              SET b.nr_copies=b.nr_copies+1
              WHERE b.id_book=a.id_book AND a.id = '$id'; ";

        $this->db->trans_start();
        $this->db->query($delete);
        $this->db->query($mod);
        $this->db->trans_complete();
        if ($this->db->trans_status() === FALSE) {
            return false;
        } else {
            return true;
        }
    }   

}

3 个答案:

答案 0 :(得分:2)

更新不存在的东西是不可能的。在第一个查询中,您的删除查询是从borrowed_books WHERE id = '$id'中删除的,但之后您正尝试使用相同的ID and a.id = '$id'更新这个borrowed_books记录。它不会更新,因为没有更新。

要说清楚,在第二个查询中,a.id指的是borrowed_books表的id,但是在删除查询(第一个查询)中,你刚刚删除了那个相同的borrowed_books记录,所以有什么都没有加入。

答案 1 :(得分:0)

quickfix可能在删除之前执行更新;

public function delete($id = null)
{
    if ($id) {
        $delete = "DELETE FROM borrowed_books 
        WHERE id = '$id'; ";

        $mod="UPDATE `books` b
              INNER JOIN `borrowed_books` a
              SET b.nr_copies=b.nr_copies+1
              WHERE b.id_book=a.id_book AND a.id = '$id'; ";

        $this->db->trans_start();
        // execute the update
        $this->db->query($mod);
        // then delete
        $this->db->query($delete);
        $this->db->trans_complete();
        if ($this->db->trans_status() === FALSE) {
            return false;
        } else {
            return true;
        }
    }   
}

更新查询条件;它正在寻找因为你删除它而不存在的数据。因此,如果您进行更新(然后您的查询在假设条件正确的情况下找到结果),它将更新..

答案 2 :(得分:0)

INNER JOIN无法找到您在交易的第一步中已删除的数据,您需要查询特定的borrowed_books数据并在删除之前将其保存在变量中。顺便说一句,我从来没有看到人们在sql中使用像UPDATE .... INNER JOIN这样的UPDATE,这会让你的代码变得如此混乱,我会稍微改变你的代码,我觉得它更容易理解。

public function delete($id = null)
{
    if ($id) {
        $borrowedBook = $this->db->query('SELECT * FROM borrowed_books WHERE id=' . $id);

        $delete = "DELETE FROM borrowed_books 
        WHERE id = '$id'; ";


        $mod = "UPDATE books SET nr_copies = nr_copies + 1 WHERE id_book = " . $borrowedBook->id_book;

        $this->db->trans_start();
        // execute the update
        $this->db->query($mod);
        // then delete
        $this->db->query($delete);
        $this->db->trans_complete();
        if ($this->db->trans_status() === FALSE) {
            return false;
        } else {
            return true;
        }
    }   
}