如何最好避免在CakePHP中插入重复记录?

时间:2014-03-23 12:32:37

标签: mysql cakephp

我从几个远程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并不是唯一的。

2 个答案:

答案 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?