使用 SugarQuery() 在链接字段上加入两个 SugarCRM 模块

Joining two SugarCRM modules on linked field using SugarQuery()

背景和背景

我正在尝试在 SugarCRM 8.0 中创建一个自定义 REST 模块,该模块将两个模块连接到一个链接字段上。这两个模块是;

这两个模块是一个名为 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。

问题

我愿意:

我在 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。如果这不起作用,请告诉我。