【问题标题】:Joining two SugarCRM modules on linked field using SugarQuery()使用 SugarQuery() 在链接字段上加入两个 SugarCRM 模块
【发布时间】:2019-06-07 13:40:42
【问题描述】:

背景和上下文

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

  • 帐户(OOTB 模块)
  • ConsumerLeads(自定义模块)

这两个模块是一个名为 w002_consumerleads_accounts_1链接字段,这样当我调用以下端点时,我会收到一个 JSON 响应,其中包含与该特定帐户 uuid 关联的所有 ConsumerLead 数据.

/rest/v11_4/Accounts/{ account_uuid }/link/w002_consumerleads_accounts_1

但是,我的自定义模块不是根据帐户 uuid 返回连接结果,而是根据唯一标识帐户的不同帐户属性返回连接结果。

/rest/v11_4/customer/{ customer_id }/leads

我试图为此构建一个自定义模块(而不是使用上面列出的预定义的 rest api)的原因是因为调用此调用的系统不知道糖帐户 uuid,而是知道一个业务唯一标识帐户的键(并且是 Accounts 模块上的属性)。

问题

当我在自定义休息模块中使用 SugarQuery 来加入 Accounts 和 ConsumerLeads 时,我的结果与第一个休息 api(预定义的休息 api)中指定的结果不匹配。结果只返回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;
    }

根据我能收集到的所有信息,此函数应返回与其 ConsumerLeads 连接的前 10 条客户记录。但是,响应只包含 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 数据返回。

问题

我愿意:

  • 使用 SugarQuery() 根据链接字段连接这两个模块
  • 使用默认的rest api基于Accounts模块上的一个属性(不是account uuid)加入两个模块

我在 Stack Overflow 上找到了这个确切的问题,上面的实现是基于该帖子的建议。但是,它仍然没有加入记录。

【问题讨论】:

    标签: php rest sugarcrm sugarbean


    【解决方案1】:

    您想要实现的目标应该是使用过滤器 API 并在请求过滤器定义中指定必填字段的内容来实现 OOTB。然后你应该会收到你想要的链接记录。

    它应该类似于https://stackoverflow.com/a/50608304/4068476

    作为快速测试,您可以尝试在浏览器或程序中调用它(这里:GET,这就是我在查询字符串中传递过滤器的原因)

    /rest/v11_4/w002_ConsumerLeads?filter[0][w002_consumerleads_accounts_1.consumer_id]={ customer_id }
    

    注意事项

    • 我猜到了 URL 中模块名称的拼写,确保大小写正确。
    • 如果您想在一个请求中同时接收 Accounts 和 ConsumerLeads - 只需使用 /bulk API 将两个请求打包为一个。

    【讨论】:

    • @ChrisMaggiulli 我稍后会发布一个批量示例。同时,请在浏览器中调用 /rest/v11_4/help 看看是否有示例,ty。
    • 忘记我最初的评论,它工作正常。谢谢
    【解决方案2】:

    试试下面的代码:

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

    【讨论】:

    • 当我添加这两个方法时,然后尝试在我的休息方法中调用它,例如 try { return outright_load_relationship('Accounts', 'w002_consumerleads_accounts_1'); } catch( 异常 $e ) { return $e->getCode();我得到一个 500 内部服务器错误。不幸的是,因为这是云版本,所以我看不到 sugarcrm.log 文件。有什么想法吗?
    • @ChrisMaggiulli 哟,请注意:您应该能够看到云版本中的sugarcrm.log。在 Administration -> System Settings ->“查看日志”(在最底部)查看它(并在其中搜索)在 Administration -> Diagnostic Tool -> 取消选中除 SugarCRM-Logfile 之外的所有内容 -> 点击“执行诊断” -> 点击“下载诊断文件”跨度>
    • @ChrisMaggiulli ,你需要传递Account Bean,通过这个函数可以获取一个Bean ...
    • $bean = BeanFactory::retrieveBean($module, $id);
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    相关资源
    最近更新 更多