通过 insert_id() 插入数据库表的最后一个 id,而不是从 Codeigniter 中的模型返回到控制器文件

Posted

技术标签:

【中文标题】通过 insert_id() 插入数据库表的最后一个 id,而不是从 Codeigniter 中的模型返回到控制器文件【英文标题】:Last insert id of a database table by insert_id() not Return to Controller file from Model in Codeigniter 【发布时间】:2018-06-13 06:24:15 【问题描述】:

对于同一个函数中的一系列操作,我想从第一个数据表中返回一行的最后插入 id 以发送第二个数据表。

我的数据库中有 2 个表。插入后,第一个表中的所有数据然后将一些数据发送到第二个表。从那里我持有最后一个插入 Auto increment Id 并希望使用该 Id 发送第二个数据表。为此,我有一个串行操作控制器功能。第一个操作表现良好,第二个操作也成功插入第二个表的其他数据除了来自第一个表的最后插入 id。在这里,我展示了我的控制器功能和模型。请给我建议。

模型文件名test_model.php和控制器文件名test.php

控制器:

public function create() 

$data['test'] = (object)$postData = [
	'test_id' 	  => $this->input->post('test_id',true),
	'test_department_id' =>$this->input->post('test_department_id',true),
	'test_catgory_id' =>$this->input->post('test_catgory_id',true),
	'test_name' =>$this->input->post('test_name',true),
	'test_descrip' =>$this->input->post('test_descrip',true),
	'test_price' =>$this->input->post('test_price',true),
	'test_report_method' =>$this->input->post('test_report_method',true),
	'test_report_day' =>$this->input->post('test_report_day',true),
	'test_dr_comi_amnt' =>$this->input->post('test_dr_comi_amnt',true),
	'test_dr_comi_percnt' =>$this->input->post('test_dr_comi_percnt',true),
	'test_ref_comi_amnt' =>$this->input->post('test_ref_comi_amnt',true),
	'test_ref_comi_percnt' =>$this->input->post('test_ref_comi_percnt',true),
	'status'      => $this->input->post('status',true)
]; 

if ($this->form_validation->run() === true) 

	if (empty($postData['test_id'])) 
		if ($this->test_model->create($postData)) 

			/*------FOR 2nd Operation------------- START -------*/
			//----- data from Model ---------
			$stest_id_1 = $this->test_model->getLast_InsertId();
			$stest_id = $this->input->post($stest_id_1);
			$sFranId = $this->input->post('frn_id');

			$sm_updated_test_price = $this->input->post('test_price');
			$test_forFran = array();
			for ($i=1; $i < sizeof($sFranId); $i++)
			
				if(!empty($sFranId[$i])) 
				$test_forFran[$i] = array(
					'm_test_id' => $stest_id,
					'm_updated_test_price' => $sm_updated_test_price,
					'm_fran_id' => $sFranId[$i]	
				);
			
			
			if($this->test_model->testInsert_PriceMaster($test_forFran))
			$this->session->set_flashdata('message', display('save_successfully'));
			

			/*------FOR 2nd Operation------------- END -------*/

			$this->session->set_flashdata('message', display('save_successfully'));

		 else 
			#set exception message
			$this->session->set_flashdata('exception',display('please_try_again'));
		
		redirect('medical_diagnosis/test/create');
	
 else 
	$data['franceschi_list'] = $this->franceschi_model->franceschi_list_forId(); 
	$data['department_list'] = $this->test_department_model->department_list();
	$data['catagory_list'] = $this->test_catagory_model->catagory_list();  
	$data['content'] = $this->load->view('medical_diagnosis/test_form',$data,true);
	$this->load->view('layout/main_wrapper',$data);

模型函数1

public function create($data = [])
	 
$this->db->insert($this->table,$data);
$last_insert_id = $this->db->insert_id(); 
return $last_insert_id;

模态函数 2 & 3

public function getLast_InsertId($last_insert_id = null)

$last_insert_id = $this->session->userdata('last_insert_id');


public function testInsert_PriceMaster($test_forFran)
	
return $this->db->insert_batch($this->fran_test_pricemaster,$test_forFran);

【问题讨论】:

【参考方案1】:

您已经从 create() 方法返回 last id,因此只需检查此 id 并直接在循环中使用它。不需要这些行:

$stest_id_1 = $this->test_model->getLast_InsertId();

/*really don't understand below line of code (pls tell)*/
$stest_id = $this->input->post($stest_id_1);

应该是这样的

public function create() 

    $data['test'] = (object)$postData = [
    'test_id'     => $this->input->post('test_id',true),
    'test_department_id' =>$this->input->post('test_department_id',true),
    'test_catgory_id' =>$this->input->post('test_catgory_id',true),
    'test_name' =>$this->input->post('test_name',true),
    'test_descrip' =>$this->input->post('test_descrip',true),
    'test_price' =>$this->input->post('test_price',true),
    'test_report_method' =>$this->input->post('test_report_method',true),
    'test_report_day' =>$this->input->post('test_report_day',true),
    'test_dr_comi_amnt' =>$this->input->post('test_dr_comi_amnt',true),
    'test_dr_comi_percnt' =>$this->input->post('test_dr_comi_percnt',true),
    'test_ref_comi_amnt' =>$this->input->post('test_ref_comi_amnt',true),
    'test_ref_comi_percnt' =>$this->input->post('test_ref_comi_percnt',true),
    'status'      => $this->input->post('status',true)
]; 

if ($this->form_validation->run() === true) 

    if (empty($postData['test_id'])) 
        $insert_id = $this->test_model->create($postData);
        if (! empty($insert_id)) 

            /*------FOR 2nd Operation------------- START -------*/
            //----- data from Model ---------
            //$stest_id_1 = $this->test_model->getLast_InsertId();
            $stest_id = $insert_id;
            $sFranId = $this->input->post('frn_id');

            $sm_updated_test_price = $this->input->post('test_price');
            $test_forFran = array();
            for ($i=1; $i < sizeof($sFranId); $i++)
            
                if(!empty($sFranId[$i])) 
                $test_forFran[$i] = array(
                    'm_test_id' => $stest_id,
                    'm_updated_test_price' => $sm_updated_test_price,
                    'm_fran_id' => $sFranId[$i] 
                );
            

            print_r($test_forFran);die;

            if($this->test_model->testInsert_PriceMaster($test_forFran))
            $this->session->set_flashdata('message', display('save_successfully'));
            

            /*------FOR 2nd Operation------------- END -------*/

            $this->session->set_flashdata('message', display('save_successfully'));

         else 
            #set exception message
            $this->session->set_flashdata('exception',display('please_try_again'));
        
        redirect('medical_diagnosis/test/create');
    
 else 
    $data['franceschi_list'] = $this->franceschi_model->franceschi_list_forId(); 
    $data['department_list'] = $this->test_department_model->department_list();
    $data['catagory_list'] = $this->test_catagory_model->catagory_list();  
    $data['content'] = $this->load->view('medical_diagnosis/test_form',$data,true);
    $this->load->view('layout/main_wrapper',$data);


【讨论】:

我收到一个错误 -- Parse error: syntax error, unexpected 'if' (T_IF) at -- "if ($insert_id) ..... " 先生,我试图获取来自模型文件的值,试图通过 $stest_id = $this->input 保存这个 $stest_id 变量->post($stest_id_1); 仅。所以我额外写了一行。 虽然我使用了你建议的代码,但我收到了错误,因为 unexpected 'if' (T_IF) 你可以这样做 $stest_id = $inser_id;无需将其添加到 post() 中 在我的回答中,我只给你需要改变的东西而不是整个代码,顺便更新我的代码,检查你的 $test_forFran 给你想要的结果

以上是关于通过 insert_id() 插入数据库表的最后一个 id,而不是从 Codeigniter 中的模型返回到控制器文件的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter:如何将 $this->db->insert_id() 值传递给控制器​​以便插入另一个表?

从 wordpress $wpdb 获取最后插入的 id

如何使用带有会话的 insert_id() 插入其他表?

python插入记录后取得主键id的方法(cursor.lastrowid和conn.insert_id())

mysql insert一条记录后怎样返回创建记录的主键id,last

mysql insert一条记录后怎样返回创建记录的主键id,last