2016-07-15 61 views
2

我开发自定义的迁移代码:数据迁移到CiviCRM - 使用CiviCRM的PHP API调用一样保持原有标识

<?php 
$result = civicrm_api3('Contact', 'create', array(
    'sequential' => 1, 
    'contact_type' => "Household", 
    'nick_name' => "boo", 
    'first_name' => "moo", 
)); 

有必要保持原来的ID,但指定“身份证”或“CONTACT_ID”上面没有工作。它要么不创建联系人,要么更新现有联系人。 当然,ID是自动递增的,但MySQL支持在这种情况下插入任意唯一值。

你将如何进行? Hack CiviCRM以某种方式将ID传递给INSERT语句中的MySQL?以某种方式在导入后转储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    |        | 

和我们谈论的第一个字段。

+0

请注意,对于未来的问题,CiviCRM有它自己的stackexchange子站点 - http://civicrm.stackexchange.com/ – samuelsov

回答

0

您应该使用external_identifier字段,该字段正是您想要的。

CiviCRM本身不使用此字段,因此不存在混淆核心功能的风险。它完成了与外部系统的链接(例如传统)。

CiviCRM认为external_identifier是唯一的,因此如果尝试插入具有相同external_identifier的联系人,它将引发错误(使用API​​ - 我认为)或更新(使用CiviCRM联系人导入屏幕)。

+0

谢谢你,这绝对是一个很好的方向,我唯一的问题是,我需要申请它也对贡献也没有这个领域。当然,这是一个向CiviCRM提供补丁以向所有(许多?)实体提供外部标识的选项。 –

+0

在这种情况下,我建议你创建一个存储这个外部标识符的贡献的自定义字段。 – samuelsov

相关问题