我第一次遇到奇怪的问题。我试图在数据库中插入具有自定义自动增量值的简单记录,例如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

提前谢谢。

最佳答案

您可能正在进入模型缓存。
从这里开始:Bakery article on caching
如果Model->cacheQueries==true,Cake会将查询结果存储在内存中。如果它稍后看到一个相同的查询,则结果将从内存中提取,而不是命中数据库。这只在单页请求期间缓存。但是,如果记录已更新,则不会清除缓存。这就是让大多数人不熟悉缓存的原因。
因此,要使代码工作,请将这一行添加到dobulk()函数的顶部:

$this->Tmp->cacheQueries = false;

当您在模型中运行原始SQL时,还可能需要将get_no()中的查询请求更改为:
$result = $this->query($strSql, false);

关于mysql - Cakephp使用create循环在MySql数据库中保存数组数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20535668/

10-11 01:47
查看更多