保存为与 ListBoxField 的 many_many 关系

Saving to a many_many relationship with a ListBoxField

我已经创建了一个名为 Service 的 DataObject 并且我与 RelatedServices 有一个 many_many 关系,如下所示:

class Service extends DataObject {
    private static $db = array (
        'Name' => 'Varchar',
        'Description' => 'Varchar',
    );

    private static $many_many = array (
        'RelatedServices' => 'RelatedService'
    );

    public function getCMSFields() {
        $fields = FieldList::create(TabSet::create('Root'));
        $services = $this->get()->where("\"Service\".\"Name\" != '$this->Name'")->map('ID', 'Name')->toArray();
        $fields->addFieldsToTab('Root.Main', array(
            TextField::create('Name'),
            TextField::create('Description'),
            ListBoxField::create('RelatedServices', 'Related services')->setMultiple(true)->setSource($services)
        ));
        return $fields;
    }
}

和:

class RelatedService extends DataObject {
    private static $db = array (
        'Name' => 'Varchar',
    );

    private static $belongs_many_many = array (
        'RelatedServices' => 'RelatedService'
    );
}

这正在 ModelAdmin 中使用,服务正常工作,包括相关服务文本区域,但它不保存。我之前做过,它位于 CMS 的一个单独选项卡中,并且有 RelatedService 和管理部分,通过数据库查看它看起来像它工作但是我认为这是一个不必要的部分所以试图将它全部放在一个现在不再保存到数据库中。

您不需要 'RelatedService' class,因为您指的是您正在工作的 class。所以与 class 'Service' 本身会更有意义。
您的代码无法运行的原因是您混淆了关系。

class Service extends DataObject{
    private static $db = array (
        'Name' => 'Varchar',
        'Description' => 'Varchar',
    );

    private static $many_many = array (
        'RelatedServices' => 'Service'
    );

    private static $belongs_many_many = array (
        'ParentServices' => 'Service'
    );

    public function getCMSFields() {
        $fields = FieldList::create(TabSet::create('Root'));
        $services = $this->get()->where("\"Service\".\"Name\" != '$this->Name'")->map('ID', 'Name')->toArray();
        $fields->addFieldsToTab('Root.Main', array(
            TextField::create('Name'),
            TextField::create('Description'),
            ListBoxField::create('RelatedServices', 'Related services')->setMultiple(true)->setSource($services)
        ));
        return $fields;
    }
}