使用ListBoxField保存为many_many关系

时间:2016-04-25 02:10:55

标签: php silverstripe

我创建了一个名为Service的DataObject,我与RelatedServices有很多关系,如下所示:

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有和管理部分,通过数据库看起来它看起来有效但我认为这是一个不必要的部分所以试图让它全部在一个现在不再保存到数据库了。

1 个答案:

答案 0 :(得分:4)

您不需要'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;
    }
}