我已经卡了一段时间,因为在 Cases 逻辑钩子中,我无法像加载另一个自定义关系那样加载contacts_cases关系,如下所示:
$bean->load_relationship('cases_lines');
$lines = $bean->cases_lines->getBeans();
$bean->load_relationship('contacts_cases');
$contacts->$bean->contacts_cases->getBeans();
前者有效,后者无效。
我发现我使用了错误的名称,因为它是默认关系,它的名称是"联系人"而不是我想象的"contacts_cases",所以我像这样更改我的代码:
$bean->load_relationship('contacts');
$contacts->$bean->contacts->getBeans();
现在它运行良好。
我在文档中没有发现默认关系和自定义关系之间的命名差异,我发现上面的解决方案只是调试 SugarBean 方法"load_relationship"并打印出加载的关系。
这行代码
error_log('LOADED RELATIONSHIPS '.print_r($this->loaded_relationships, true));
打印出来
Array'n('n [0] => cases_lines'n [1] => contacts'n)'n
在 Studio 中,关系显示为"contacts_cases",我唯一找到"联系人"名称的地方是在文件模块/案例/vardefs 中.php
'contacts' =>
array (
'name' => 'contacts',
'type' => 'link',
'relationship' => 'contacts_cases',
'source'=>'non-db',
'vname'=>'LBL_CONTACTS',
),
同样在关系表中,relationship_name是"contacts_cases"。
有没有地方可以看到我在打电话时必须使用的真实姓名load_relationship或者唯一的解决方案是在 vardefs 中查找?
最简单的单一来源是查看缓存目录,因为这将所有自定义和现成的字段和关系合并到一个大数组中。若要从"帐户"角度查看所有关系,请选中cache/modules/Accounts/Accountsvardefs.php
并查找relationships
键以及link
type
参数的任何fields
。您会发现"股票"关系,如contacts
和opportunities
,以及任何和所有自定义关系都内置到该数组中。
请注意,自定义关系将被称为不同的东西,具体取决于您正在使用的对象。例如,自定义模块"膳食"和"配料"之间的自定义一对多关系可能在"餐"端命名为"key_meals_ingredients_meals
",在"配料"端命名为key_meals_ingredients_ingredients
。
您还可以使用 Studio 在用户界面中找到这些内容。依次导航到 Studio、您的模块和"关系"表。"关系"表左侧的"名称"列是你要追求的值。
要获取 load_relationship
的所有可能值的列表,请使用以下代码片段:
$rels = [];
foreach ($bean->getFieldDefinitions() as $key=>$val) {
if (isset($val['type']) && $val['type'] === 'link') {
$rels[] = $key;
}
}
这从$bean
开始(例如,在逻辑挂钩内部),并生成一个包含所有有效关系名称的rels[]
数组。
这段代码旨在作为临时帮助,使用它来获取列表并选择正确的值,然后删除此代码。
这使用与load_relationship
函数相同的定义集,因此它应该是准确的。