【问题标题】:Data migration into CiviCRM - keep legacy IDs数据迁移到 CiviCRM - 保留旧 ID
【发布时间】:2016-07-15 15:13:54
【问题描述】:

我使用 CiviCRM 的 PHP API 调用开发自定义迁移代码,例如:

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

需要保留原始 ID,但在上面指定 'id' 或 'contact_id' 不起作用。它要么不创建联系人,要么更新现有联系人。 ID 是自动递增的,当然,但 MySQL 支持在这种情况下插入任意的唯一值。

您将如何进行?破解 CiviCRM 在 INSERT 语句中以某种方式将 id 传递给 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              |                             |

我们谈谈第一个领域。

【问题讨论】:

标签: php mysql sql civicrm


【解决方案1】:

您应该使用完全符合您需要的 external_identifier 字段。

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

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

【讨论】:

  • 谢谢你,这绝对是一个很好的方向,我唯一的问题是我也需要将它应用到没有这个字段的贡献中。当然,也可以选择向 CiviCRM 提供补丁,以便为所有(许多?)实体提供外部 ID。
  • 在这种情况下,我建议您在贡献上创建一个自定义字段来存储此外部标识符。