使用 SugarQuery() 在链接字段上加入两个 SugarCRM 模块
Joining two SugarCRM modules on linked field using SugarQuery()
背景和背景
我正在尝试在 SugarCRM 8.0 中创建一个自定义 REST 模块,该模块将两个模块连接到一个链接字段上。这两个模块是;
- 账户(一个 OOTB 模块)
- ConsumerLeads(自定义模块)
这两个模块是一个名为 w002_consumerleads_accounts_1 的 链接字段 ,因此当我调用以下端点时,我得到一个 JSON 响应与该特定帐户 uuid 关联的所有 ConsumerLead 数据。
/rest/v11_4/Accounts/{ account_uuid }/link/w002_consumerleads_accounts_1
但是,我的自定义模块 return 不是根据帐户 uuid return 连接结果,而是根据唯一标识帐户的不同帐户属性来连接结果。
/rest/v11_4/customer/{ customer_id }/leads
The reason I am attempting to build a custom module for this ( instead of using the predefined rest api listed above ) is due to the fact that the system invoking this call does not know the sugar account uuid, and instead knows a business key that uniquely identifies the account ( and is an attribute on the Accounts module ).
问题
当我在我的自定义剩余模块中使用 SugarQuery 来加入 Accounts 和 ConsumerLeads 时,我的结果与第一个剩余 api(预定义剩余 api)中指定的结果不匹配。结果只return加入了Accounts模块,并没有加入ConsumerLeads模块。
问题出在链接字段上两个模块的连接上;该问题与使用客户 uuid 与帐户 uuid 无关。
参考实现
我根据 SugarCRM 开发人员指南编写了以下代码。
public function GetLinkLeads($api, $args) {
try {
$query = new SugarQuery();
$query->from(BeanFactory::getBean('Accounts'));
$query->join('w002_consumerleads_accounts_1');
$query->limit(10);
$results = $query->execute();
return $results;
} catch ( Exception $e ) {
return $e->getCode();
}
return 1;
}
根据我能收集到的所有信息,此函数应该 return 前 10 个帐户记录与其 ConsumerLeads 合并。但是响应中只包含Accounts模块数据,并没有加入ConsumerLeads数据。
另外,我也试过下面的方法
public function GetLinkLeads($api, $args) {
try {
$account = BeanFactory::getBean('Accounts', '4606e963-9213-7764-d83f-4cc050c8473d');
if ( $account->load_relationship('w002_consumerleads_accounts_1') ) {
$lead = $account->w002_consumerleads_accounts_1->getBeans();
return $lead;
}
} catch ( Exception $e ) {
return $e->getCode();
}
return 1;
}
其中 4606e963-9213-7764-d83f-4cc050c8473d
是关联了 ConsumerLeads 的帐户 uuid,但我仍然无法将 ConsumerLeads 数据获取到 return。
问题
我愿意:
- 使用 SugarQuery() 基于 链接字段连接这两个模块
- 使用默认的restapi根据Accounts模块上的一个属性(不是account uuid)加入两个模块
我在 Stack Overflow 上发现了这个确切的问题,上面的实现是基于 post 的建议。但是,它仍然没有加入记录。
您想要实现的目标应该在 OOTB 中使用过滤器 API 并在您的请求过滤器定义中指定所需字段的内容。然后你应该收到你想要的链接记录。
它的工作原理应该类似于
作为快速测试,您可以尝试在浏览器或程序中调用它(此处:GET
,这就是我在查询字符串中传递过滤器的原因)
/rest/v11_4/w002_ConsumerLeads?filter[0][w002_consumerleads_accounts_1.consumer_id]={ customer_id }
备注:
- 我猜对了 URL 中模块名称的拼写,请确保 uppercase/lowercase 正确。
- 如果您想在单个请求中同时接收帐户和消费者信息 - 只需使用 /bulk API 将两个请求合并为一个。
试试下面的代码:
function outright_load_relationship( $left_bean, $rel_name,$return_beans = 0 ) {
$rel_obj = $left_bean->load_relationship( $rel_name );
if ( !$rel_obj ){
$rel_name =outright_get_bean_fields( $rel_name );
$rel_obj = $left_bean->load_relationship( $rel_name );
}
if( $return_beans ){
$relatedBeans = $left_bean->$rel_name->getBeans();
return $relatedBeans;
}
return $left_bean->$rel_name;
}
function outright_get_bean_fields( $left_bean, $fld_name = false, $fld_key = false ) {
if( !$fld_name && !$fld_key ) {
return $left_bean->field_defs;
} else {
foreach( $left_bean->field_defs as $key=>$value ) {
if( $fld_name && $key == $fld_name ) {
return $left_bean->field_defs[$key];
} else if( $fld_key && $value[$fld_key] == $fld_name ){
return $left_bean->field_defs[$key];
}
}
}
}
您只需在上述函数中传递正确的 $rel_name
。如果这不起作用,请告诉我。
背景和背景
我正在尝试在 SugarCRM 8.0 中创建一个自定义 REST 模块,该模块将两个模块连接到一个链接字段上。这两个模块是;
- 账户(一个 OOTB 模块)
- ConsumerLeads(自定义模块)
这两个模块是一个名为 w002_consumerleads_accounts_1 的 链接字段 ,因此当我调用以下端点时,我得到一个 JSON 响应与该特定帐户 uuid 关联的所有 ConsumerLead 数据。
/rest/v11_4/Accounts/{ account_uuid }/link/w002_consumerleads_accounts_1
但是,我的自定义模块 return 不是根据帐户 uuid return 连接结果,而是根据唯一标识帐户的不同帐户属性来连接结果。
/rest/v11_4/customer/{ customer_id }/leads
The reason I am attempting to build a custom module for this ( instead of using the predefined rest api listed above ) is due to the fact that the system invoking this call does not know the sugar account uuid, and instead knows a business key that uniquely identifies the account ( and is an attribute on the Accounts module ).
问题
当我在我的自定义剩余模块中使用 SugarQuery 来加入 Accounts 和 ConsumerLeads 时,我的结果与第一个剩余 api(预定义剩余 api)中指定的结果不匹配。结果只return加入了Accounts模块,并没有加入ConsumerLeads模块。
问题出在链接字段上两个模块的连接上;该问题与使用客户 uuid 与帐户 uuid 无关。
参考实现
我根据 SugarCRM 开发人员指南编写了以下代码。
public function GetLinkLeads($api, $args) {
try {
$query = new SugarQuery();
$query->from(BeanFactory::getBean('Accounts'));
$query->join('w002_consumerleads_accounts_1');
$query->limit(10);
$results = $query->execute();
return $results;
} catch ( Exception $e ) {
return $e->getCode();
}
return 1;
}
根据我能收集到的所有信息,此函数应该 return 前 10 个帐户记录与其 ConsumerLeads 合并。但是响应中只包含Accounts模块数据,并没有加入ConsumerLeads数据。
另外,我也试过下面的方法
public function GetLinkLeads($api, $args) {
try {
$account = BeanFactory::getBean('Accounts', '4606e963-9213-7764-d83f-4cc050c8473d');
if ( $account->load_relationship('w002_consumerleads_accounts_1') ) {
$lead = $account->w002_consumerleads_accounts_1->getBeans();
return $lead;
}
} catch ( Exception $e ) {
return $e->getCode();
}
return 1;
}
其中 4606e963-9213-7764-d83f-4cc050c8473d
是关联了 ConsumerLeads 的帐户 uuid,但我仍然无法将 ConsumerLeads 数据获取到 return。
问题
我愿意:
- 使用 SugarQuery() 基于 链接字段连接这两个模块
- 使用默认的restapi根据Accounts模块上的一个属性(不是account uuid)加入两个模块
我在 Stack Overflow 上发现了这个确切的问题,上面的实现是基于 post 的建议。但是,它仍然没有加入记录。
您想要实现的目标应该在 OOTB 中使用过滤器 API 并在您的请求过滤器定义中指定所需字段的内容。然后你应该收到你想要的链接记录。
它的工作原理应该类似于
作为快速测试,您可以尝试在浏览器或程序中调用它(此处:GET
,这就是我在查询字符串中传递过滤器的原因)
/rest/v11_4/w002_ConsumerLeads?filter[0][w002_consumerleads_accounts_1.consumer_id]={ customer_id }
备注:
- 我猜对了 URL 中模块名称的拼写,请确保 uppercase/lowercase 正确。
- 如果您想在单个请求中同时接收帐户和消费者信息 - 只需使用 /bulk API 将两个请求合并为一个。
试试下面的代码:
function outright_load_relationship( $left_bean, $rel_name,$return_beans = 0 ) {
$rel_obj = $left_bean->load_relationship( $rel_name );
if ( !$rel_obj ){
$rel_name =outright_get_bean_fields( $rel_name );
$rel_obj = $left_bean->load_relationship( $rel_name );
}
if( $return_beans ){
$relatedBeans = $left_bean->$rel_name->getBeans();
return $relatedBeans;
}
return $left_bean->$rel_name;
}
function outright_get_bean_fields( $left_bean, $fld_name = false, $fld_key = false ) {
if( !$fld_name && !$fld_key ) {
return $left_bean->field_defs;
} else {
foreach( $left_bean->field_defs as $key=>$value ) {
if( $fld_name && $key == $fld_name ) {
return $left_bean->field_defs[$key];
} else if( $fld_key && $value[$fld_key] == $fld_name ){
return $left_bean->field_defs[$key];
}
}
}
}
您只需在上述函数中传递正确的 $rel_name
。如果这不起作用,请告诉我。