Silverstripe:循环 many_many,同事页面没有重复项

Silverstripe: loop many_many without duplicates for a Colleagues page

我的一个站点有员工部分,设置为 holder/page 模式。

部门是数据对象。 员工档案是页面。

两者是 many_many 关系 - 一个 Staff Profile 可以有很多 Departments,一个 Department 有很多 Staff Profiles。

在“员工档案”页面上,我想列出与“员工档案”关联的所有部门的同事。

我可以毫无问题地列出所有同事的名字,但是如果一位同事共享多个部门,则该人的名字会针对他们也出现在的每个部门列出。例如如果他们与当前员工档案共享两个部门,他们会在同事列表中出现两次

我希望任何同事在同事列表中只出现一次。

我已经尝试过 GroupedList - 它做了它应该做的,但是为列表中出现的同事的每个实例复制了组,所以我得到了与没有组相同的结果。

有没有人知道我如何在针对部门循环时仅显示唯一的 StaffProfiles?

这是一种方法:

// Department.php
class Department extends DataObject
{
    private static $many_many = [
        'StaffProfilePages'  => 'StaffProfilePage'
    ];
}

// StaffProfilePage.php
class StaffProfilePage extends Page
{
    private static $belongs_many_many = [
        'Departments'  => 'Department'
    ];

    /**
     * Fetch all StaffProfilePages that aren't this one, and share
     * at least one department with this StaffProfilePage.
     *
     * @return DataList
     */
    public function Colleagues()
    {
        return StaffProfilePage::get()->filter(
            [
                'ID:not' => $this->ID,
                'Departments.ID' => $this->Departments()->column('ID')
            ]
        );
    }
}

然后像这样访问模板文件中的同事(确保在 StaffProfilePage 的上下文中):

<%-- StaffProfilePage.ss --%>
<% loop $Colleagues %>
    Hello I am {$Title} and I work with {$Up.Title}. <br />
<% end_loop %>

一些参考: https://docs.silverstripe.org/en/3/developer_guides/model/data_model_and_orm/#filtering-results https://docs.silverstripe.org/en/3/developer_guides/model/searchfilters/