如何在 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