2013-12-12 38 views
2

我第一次遇到奇怪的問題。我正嘗試在自定義自動遞增值(例如00001,00002,00003)的數據庫中插入簡單記錄,但無法獲得遞增值。每個記錄都會使用相同的最大數量更新。CakePHP使用循環創建MySql數據庫中保存數組數據

控制器代碼

public function dobulk() { 
    for($i=0;$i<5;$i++) { 
     $data = array(); 
     $this->Tmp->create(); 
     $data['Tmp']['invoice_no'] = $this->Tmp->get_no(); 
     $data['Tmp']['invoice_date'] = '2013-12-11'; 
     $this->Tmp->save($data); 
    } 
    } 

型號代碼

public function get_no() { 
    $strSql = "SELECT 
       LPAD(IFNULL(RIGHT(MAX(invoice_no),5),0) + 1,5,'0') AS max_id 
     FROM tmps 
     ;"; 

    $result = $this->query($strSql); 
    $invoice_no = $result[0][0]['max_id']; 
    return $invoice_no; 
} 

數據庫表格

CREATE TABLE `tmps` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `invoice_no` varchar(20) DEFAULT NULL, 
    `invoice_date` date DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1 

感謝進階ANCE。

+1

看起來像這樣應該被標記爲MySQL而不是CakePHP。你可能會得到更多的幫助,因爲這是一個MySQL問題。 – Dave

回答

1

您可能正在運行模型緩存。

從這裏:Bakery article on caching

如果型號 - > cacheQueries ==真,蛋糕將存儲在內存中的查詢結果。如果它稍後看到一個相同的查詢,結果將從內存中取出而不是打到數據庫。這僅在單個頁面請求期間被緩存。但是,如果記錄更新,緩存不會被清除。這是大多數人不熟悉緩存的原因。

因此,爲了使你的代碼的工作,這行添加到dobulk的頂部()函數:

$this->Tmp->cacheQueries = false; 

當你運行你的模型內生SQL,你可能還需要改變get_no()裏面的查詢請求爲:

$result = $this->query($strSql, false); 
+0

謝謝本。它真的有效。我不知道我是如何遺漏Cache的。 –

0

希望下面的解決方案將幫助你!

public function get_no() { 
     $strSql = "SELECT MAX(invoice_no) AS max_id FROM tmps;"; 
     $result = $this->query($strSql); 
     $invoice_no = $result['Tmp']['max_id']; 
     return $invoice_no; 
    } 


    public function dobulk(){ 
     $data = array(); 
     $tempInvoiceNumber = $this->Tmp->get_no(); 
     for($i=1;$i<=5;$i++) { 
     $data[$i]['Tmp']['invoice_no'] = tempInvoiceNumber+$i; 
     $data[$i]['Tmp']['invoice_date'] = '2013-12-11'; 
     } 
     $this->Tmp->saveAll($data); 
    } 
+0

感謝Anubhav, 我會執行您的解決方案,但我不知道這個問題的根本原因是什麼。 –