Codeigniter +在详细信息表

时间:2018-03-27 19:57:31

标签: php mysql codeigniter codeigniter-3

原样(工作):我有以下情况: - 查询的视图,其中包含存储在单独表中的一些详细信息(图像,附加元素)。每当我们添加一个新查询时,我需要创建一个临时id,使用临时id在附加表中添加详细信息,并且在保存查询本身时,我将使用tbl_iqnuiry中最后插入的id切换临时id。

期望的解决方案(如下所示):我知道这不是最佳解决方案,这就是我想使用Codeigniter的trans_start()

的原因

为此,我有以下表格:

  • tbl_inquiry(inquiry_id,customer,col2,col3 ..)
  • tbl_inquiry_images(id,inquiry_id,src ..)
  • tbl_inquiry_details(id,inquiry_id,detail1,detail2 ..)

我有一个名为Inquiry_model

的模型
class Inquiry_model extends CI_Model {

    public function __construct()
    {
        parent::__construct();
    }

    public function insert_inquiry($data) {
        return $this->db->insert('tbl_inquiry', $data);        
    }

    public function insert_inquiry_image($data) {
        return $this->db->insert('tbl_inquiry_images', $data);        
    }

    public function insert_inquiry_detail($data) {
        return $this->db->insert('tbl_inquiry_details', $data);        
    }

    public function update_inquiry($id_inquiry, $data) {
        $this->db->set($data);
        $this->db->where('inquiry_id', $id_inquiry);
        return $this->db->update('tbl_inquiry');        
    }
}

控制器,查询如下:

class Inquiries extends Admin_Controller
{

    public function __construct()
    {
        parent::__construct();
    }

    public function create() 
    {
        if (isset($_POST) && !empty($_POST))
        {
            $id_inquiry            = $this->input->post('inquiry_id');             
        } 
        else
        {
            /* Begin transaction */
            /* I only add trans_start() in the ELSE part because this is the first place where the view will enter, since we do not post anything. If we would let's say press the Save button, this part will be skipped, but the start_trans had already started */

            $this->db->trans_start();   

            $this->inquiry_model->insert_inquiry($data); 
            $inquiry_id           = $this->db->insert_id();              
        }

        /* definitions and form validations are placed here but not relevant to the scenario itself (multiple fields)*/

        if (isset($_POST) && !empty($_POST)) {
            if ($this->form_validation->run() == true) {
                /* if nothing to change OR if update succes*/
                if ($this->inquiry_model->update_inquiry($id_inquiry, $data)) {   
                    /* Close transaction */
                    $this->db->trans_complete(); 
                    $this->inquiry_model->update_inquiry($id_inquiry, $data) 
                    redirect('inquiries')
                }
            }
        }

        /* $this->data['elements'] are placed in this area but not relevant to the scenario described (multiple elements)*/

        $this->load->view('inquiries/create', $this->data);
    }
}

正如您所看到的,如果第一次打开视图并且如果我们没有在该页面中发布任何内容,则启动事务,否则我们捕获已生成的id

在视图中,我使用一些Ajax来使用控制器中创建的inquiry_id添加细节和图像。插入细节和图像工作正常。

问题在于,每当我尝试保存查询本身时,tbl_inquiry的ID都会与tbl_inquiry_imagestbl_inquiry_details

中使用的ID不同

如果您认为我做错了,请告诉我,正如我所提到的,我想改进处理这种插页的方式

谢谢!

1 个答案:

答案 0 :(得分:1)

制作一个步骤表格。假设您有3个基于3个表的表单,请从最常用的表开始,这个表看起来像tbl_inquiry。在form_controller/step1上,用户可以插入查询所需的一些详细信息。在帖子上重定向到或通过ajax步骤2 form_controller/step2加载。如果使用重定向,只需在url中传递新生成的id,如果是ajax,则将id作为json对象的一部分返回。重要的是,设置created_at时间。

继续使用此逻辑/结构,直到最后一步,例如添加图像。在该页面上可能有一个按钮,表示查询已完成,并在按下按钮时将查询标记为已完成,并在数据库中设置已完成的标记。

如果出于某种原因,用户未在created_at时间的72小时内完成表单(已完成标志为true) - 使用cron作业 - 请使用inquiry_id删除所有相关项目。

您还可以在页面加载时在主表中插入一个空白 - 获取id,并使用相关的inquiry_id字段在所有其他表中插入空格。这样,每个表中都有一个项目。然后,您可以将此id作为var中的js分配,然后您对该查询的所有查询都将是更新而不是插入 - 确保没有错误放置数据。

您可以使用类似的方法删除未完成的表单。

要准确回答广泛的问题总是很困难。我希望我至少提出一些思路。如果不确切知道发生了什么,很难推测。