我使用CiviCRM的PHP调用开发自定义迁移代码,如下所示:
<?php
$result = civicrm_api3('Contact', 'create', array(
'sequential' => 1,
'contact_type' => "Household",
'nick_name' => "boo",
'first_name' => "moo",
));需要保留原始id,但在上面指定'id‘或'contact_id’是行不通的。它要么不创建联系人,要么更新现有联系人。当然,ID是自动递增的,但是MySQL支持在这种情况下插入任意的唯一值。
你会怎么做?在INSERT语句中以某种方式将id传递给CiviCRM?在导入之后以某种方式转储SQL,并在.sql文本文件中对ID进行就地操作(很难保持完整性)?有什么建议吗?
我至少有300.000条条目要处理,所以一个完全自动化和健壮的解决方案是必须的。有任何SQL魔力可以做到吗?
对于那些不熟悉CiviCRM的人,表结构如下:
mysql> desc civicrm_contact;
+--------------------------------+------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------------+------------------+------+-----+-------------------+-----------------------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| contact_type | varchar(64) | YES | MUL | NULL | |
| contact_sub_type | varchar(255) | YES | MUL | NULL | |
| do_not_email | tinyint(4) | YES | | 0 | |
| do_not_phone | tinyint(4) | YES | | 0 | |
| do_not_mail | tinyint(4) | YES | | 0 | |
| do_not_sms | tinyint(4) | YES | | 0 | |
| do_not_trade | tinyint(4) | YES | | 0 | |
| is_opt_out | tinyint(4) | NO | | 0 | |
| legal_identifier | varchar(32) | YES | | NULL | |
| external_identifier | varchar(64) | YES | UNI | NULL | |我们讨论第一个领域。
发布于 2016-07-18 13:40:58
您应该使用external_identifier字段,这正是您想要的结果。
CiviCRM本身不使用这个字段,因此不存在扰乱核心功能的风险。这是为了链接到外部系统(例如,遗留系统)。
CiviCRM认为external_identifier是唯一的,所以如果您尝试使用同一个external_identifier插入联系人,它会抛出一个错误(使用API -我认为)或更新(使用CiviCRM联系人导入屏幕)。
https://stackoverflow.com/questions/38399603
复制相似问题