Cakephp使用带有create的循环在MySql数据库中保存数组数据

时间:2013-12-12 05:23:11

标签: mysql cakephp cakephp-2.3

我第一次遇到奇怪的问题。我试图在自定义自动增量值中插入简单记录,例如00001,00002,00003但无法获得增量值。每条记录都以相同的最大数量更新。

控制器代码

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可能正在进入模型缓存。

从这里开始:Bakery article on caching

  

如果Model-&gt; cacheQueries == true,Cake会将查询结果存储在内存中。如果它稍后看到相同的查询,则结果将从内存中提取而不是命中数据库。这仅在单个页面请求的持续时间内缓存。但是,如果更新记录,则不会清除缓存。这是大多数人不熟悉缓存的原因。

因此,要使代码正常工作,请将此行添加到dobulk()函数的顶部:

$this->Tmp->cacheQueries = false; 

当您在模型中运行原始SQL时,您可能还必须将get_no()中的查询请求更改为:

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

答案 1 :(得分: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);
    }