我已經在這裏5天了。我閱讀了所有我可以在這裏找到的答案,我嘗試了任何選項,我無法找到如何解決此緩存問題。cakephp檢查重複行
我使用CakePHP 2.4.4可能升級,但我沒有看到任何的將Change.log我的問題 Percona的MYSQL 5.6 Innodb的
我們已經插入,我們在一個循環中調用一個模型行
App::import('Model', 'TableA');
$TableA = new TableA();
foreach($rows as $row){
$TableA->InsertRow($row);
}
然後我們有一個表A
模型我添加上TableA.Sku唯一索引,以避免重複錄入
class TableA extends AppModel {
var $name = 'TableA';
var $cacheQueries = false;
var $validate = array();
function InsertRow($data){
$this->clear();
try {
$result = $this->find('first', array(
'fields' => array(
'TableA.id',
),
'conditions' => array(
'TableA.Sku' => $data['Sku'],
),
));
pr($result);
if(!isset($result['TableA']['id'])){
$data['TimeStamp'] = strtotime("now");
$this->save($data);
}
return TRUE;
}
catch (Exception $e) {
pr($e);
$resultNow = $this->find('first', array(
'fields' => array(
'TableA.id',
),
'conditions' => array(
'TableA.Sku' => $data['Sku'],
),
));
pr($resultNow);
}
}
}
第一循環$行有多個時間上彼此跟隨 相同SKU第一循環插入該行 第二循環給出:
array
(
)
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'tue026991015' for key 'Sku'
INSERT INTO `ki`.`TableA` (`Sku`, `TimeStamp`) VALUES ('tue026991015', 1453858976)
Array
(
[TableA] => Array
(
[id] => 31951
)
)
我還正在調試運行模式2
在第二個循環中,查詢應該返回id,並且循環不應該嘗試插入行,但它不是。 我加了var $ cacheQueries = false;在模型之上以避免兌現。我不知道爲什麼會發生這種行爲,以及如何避免任何MySQL兌現此功能。
爲什麼不使用驗證規則來測試'Sku'是獨一無二的,而不是重新發明車輪?如果'Sku'總是需要唯一'TableA'應該使用'Sku'字段上的'isUnique'驗證規則,如果它已經存在,會導致'save'失敗。這將大大簡化您的代碼。 – drmonkeyninja
添加驗證工作就像在mysql表中添加唯一索引一樣工作,這就是我用來解決問題的方法。這證實find('first')正在使用緩存.....這裏真正的問題是如何禁用find('first')的緩存 –
添加一個驗證規則是*不同於添加唯一索引在桌子上。驗證規則將首先檢查數據庫是否尚未使用該值,並且會阻止保存查詢運行(以及標記錯誤),只是在表上添加唯一索引不會阻止Cake運行查詢這會導致你看到的MySQL錯誤被拋出。您確實應該將其作爲驗證規則來執行此操作,否則在嘗試保存數據時不會捕獲這些錯誤。 – drmonkeyninja