2013-12-12 39 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, 我会执行您的解决方案,但我不知道这个问题的根本原因是什么。 –