关系的getBeans()返回空数组

时间:2019-03-07 07:07:11

标签: php sugarcrm

我正在创建一个自定义ACL类,该类将检查记录之间是否存在关系,如果存在,则将所有相关记录加载到该特定bean。我看过Sugar文档,该文档说使用load_relationship($relationshipName)来检查是否存在关系,并使用getBeans()来加载所有相关记录(作为对象数组)。我已经在类中实现了它,但是由于某种原因,无论我使用哪个模块和关系,它总是返回一个空数组。

我用于检查的数据分为三部分:

  1. 访问数据的模块
  2. 与目标模块的关系名称(不是模块名称)
  3. 访问数据的记录的ID

Sugar社区的链接here显示了我遇到的类似问题,但是答案并不能解决我的问题

这是我的自定义ACL:

namespace Sugarcrm\Sugarcrm\custom\clients\base;

class CustomACL
{
    const ACL_NONE = 0;
    const ACL_READ_ONLY = 1;
    const ACL_READ_WRITE = 2;

    public static function checkRelated($module, $linkedRelationshipName, $id)
    {
        $bean = \BeanFactory::getBean($module);
        if ($bean->load_relationship($linkedRelationshipName)) {
            return self::checkRecordRelated($bean, $id,$linkedRelationshipName);
        } else {
            return false;
        }
    }

    /**
     * Checks if record is related
     * @param $bean
     * @param $id
     * @param $linkedModule
     * @return bool
     */
    protected static function checkRecordRelated($bean, $id, $linkedModule)
    {
        $bean->retrieve_by_string_fields(array(
            "id" => $id
        ));
        if ($bean->load_relationship($linkedModule)) {
            $relatedRecords = $bean->$linkedModule->getBeans();
            return $relatedRecords;
        } else {
            return false;
        }
    }

}

该类应适用于任何模块,即使它是自定义或非自定义的。我尝试使用自定义模块,甚至使用默认模块(潜在客户,客户等),但除了空数组之外,它们均未返回任何内容。

1 个答案:

答案 0 :(得分:1)

我怀疑问题是您正在重用以前为空的bean,之前您已经使用load_relationship()为其加载了相同的链接。
在第二个{{1 }}调用,Sugar可能会从第一个调用返回缓存的结果(因为该链接已经在内部被标记为已加载),因此再次返回相同的空数组。

因此而不是使用

load_relationship()

我建议创建一个新的bean,例如使用

$bean->retrieve_by_string_fields(array(
        "id" => $id
    ));

(实际上应该不会太慢,因为bean可能已经被缓存了)

注意:

  • 您的变量名有些混乱。 if (empty($id)) { return false; } $bean = BeanFactory::retrieveBean($module, $id); if (!$bean) { return false; } $linkedRelationshipName既不应该包含关系名称也不应该包含模块名称,而应包含链接类型字段的名称。

编辑:

重申: 该文档可能会误导您,但是$linkedModule不会期望以关系名称作为参数。期望的是链接名称!。

来自load_relationship()

data/SugarBean.php

因此,请确保检查每个模块的VarDef以获取正确的链接名称。

例如

  • 关系名称:/** * Loads the request relationship. This method should be called before performing any operations on the related data. * * This method searches the vardef array for the requested attribute's definition. If the attribute is of the type * link then it creates a similary named variable and loads the relationship definition. * * @param string $link_name link/attribute name. * *@return nothing. */ function load_relationship($link_name)
  • 帐户中此关系的链接字段:accounts_contacts
    ,因此您应该致电contacts
  • 联系人中此关系的链接字段:$accountBean->load_relationship('contacts')
    ,因此您应该致电accounts

注意:链接名称在不同模块之间基本上是任意的,不要依赖于链接模块的小写单数或复数形式。在某些情况下(对于自定义关系),不会。