保存到与列表框字段的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 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;
    }
}