如何在 DataExtension 对象中获取 has_many 个对象?
How to get has_many objects in DataExtension object?
SS4.4
我有两个 classes 成员和 Activity。一个会员有很多活动。我有一个扩展 Member 的 class MemberExtension。在 MemberExtension 中,我们有一个包含“Activities”的 has_many 数组。我们如何获取 MemberExtension 中的活动列表?
我们尝试了以下方法:
$this->Activities()
错误:未捕获错误:调用未定义的方法 MemberExtension::Activities()
$this->getOwner()->Activities()
错误:未捕获的 BadMethodCallException:对象->__call():方法 'Activities' 在 'SilverStripe\Security\Member'
上不存在
我们也运行dev/build?flush
// MemberExtension class
class MemberExtension extends DataExtension {
public static $has_many = [
'Activities' => Activity::class
];
}
// Activity class
class Activity extends DataObject {
private static $has_one = [
'Member' => Member::class,
];
}
// Register MemberExtension in _config.php
Member::add_extension(MemberExtension::class);
在 MemberExtension $this->owner->Activities()
中应该可以。
在 Silverstripe CMS 4 中,您还需要使用 FQCN(完全限定 class 名称,也就是包括整个命名空间。这意味着您需要在添加扩展时使用 SilverStripe\Security\Member
。它也是使用 yml 配置文件向 classes 添加扩展的好习惯,请参阅 documentation.
SilverStripe\Security\Member:
extensions:
- MemberExtension
假设您的扩展还没有命名空间。
然后在 运行 dev/build/flush 之后,您应该可以调用活动关系,如上所示:
$activities = $this->owner->Activities(); //name of the relation as always
SS4.4
我有两个 classes 成员和 Activity。一个会员有很多活动。我有一个扩展 Member 的 class MemberExtension。在 MemberExtension 中,我们有一个包含“Activities”的 has_many 数组。我们如何获取 MemberExtension 中的活动列表?
我们尝试了以下方法:
$this->Activities()
错误:未捕获错误:调用未定义的方法 MemberExtension::Activities()
$this->getOwner()->Activities()
错误:未捕获的 BadMethodCallException:对象->__call():方法 'Activities' 在 'SilverStripe\Security\Member'
上不存在我们也运行dev/build?flush
// MemberExtension class
class MemberExtension extends DataExtension {
public static $has_many = [
'Activities' => Activity::class
];
}
// Activity class
class Activity extends DataObject {
private static $has_one = [
'Member' => Member::class,
];
}
// Register MemberExtension in _config.php
Member::add_extension(MemberExtension::class);
在 MemberExtension $this->owner->Activities()
中应该可以。
在 Silverstripe CMS 4 中,您还需要使用 FQCN(完全限定 class 名称,也就是包括整个命名空间。这意味着您需要在添加扩展时使用 SilverStripe\Security\Member
。它也是使用 yml 配置文件向 classes 添加扩展的好习惯,请参阅 documentation.
SilverStripe\Security\Member:
extensions:
- MemberExtension
假设您的扩展还没有命名空间。
然后在 运行 dev/build/flush 之后,您应该可以调用活动关系,如上所示:
$activities = $this->owner->Activities(); //name of the relation as always