我从几个远程DataSource中提取数据,重组以适应我的模型架构,最后将数组传递给MyModel::saveAll();
我希望避免导入重复记录(即,如果db中已存在MyModel.external_id = 120
& MyModel.external_type = 'basecamp.comment'
,则不要导入。
最有效的方法是什么?
$data['MyModel'] = [
[
'title' => 'foo',
'created' => '2013-12-18 11:29:06',
'external_id' => 120,
'external_type' => 'github.commit'
],
[
'title' => 'bar',
'created' => '2013-12-18 13:22:06',
'external_id' => 120,
'external_type' => 'basecamp.comment'
]
];
注意:请注意MyModel.external_id
并不是唯一的。
答案 0 :(得分:4)
这是验证发挥作用的地方。在MyModel
课程中,添加以下内容:
public $validate = array(
'external_type' => array(
'rule' => 'idAndTypeUnique',
'message' => "Type and ID already exist"
)
);
public function idAndTypeUnique()
{
$existing = $this->find('first', array(
'conditions' => array(
'external_id' => $this->data[$this->name]['external_id'],
'external_type' => $this->data[$this->name]['external_type']
)
));
return (count($existing) == 0);
}
您的saveAll()
电话看起来像是:
$this->MyModel->saveAll($data, array('validate' => true));
答案 1 :(得分:3)
最简单的方法是在这两个字段上创建一个唯一索引。
alter table my_model add unique index(external_id, external_type);
这会强制数据库级别的约束。
如果要在蛋糕层中强制使用此约束,请检查以下内容: cakephp isUnique for 2 fields?