SilverStripe 3.1 ListboxField 保存数组到数据库

SilverStripe 3.1 ListboxField save array to database

我想知道如何正确保存使用 ListboxField 选择的值。

new ListboxField(
    $name = "Categorie",
    $title = "Catégorie(s)",
    Categories::get()->map('ID','Title'),
    $value = 1,
    $size = 4,
    $multiple = true
);

在我的示例中,我可以将多个类别保存到一个 $db 字段中。我正在使用:

private static $db = array(
    'Categorie' => 'Varchar'
);

它可以工作,但是当我试图将类别名称恢复到模板中时,它根本不起作用。例如存储的数据是"1,4,9".

是否有更好的方法来存储来自 ListboxField 的变量?

使用 $many_many 关系而不是 $db 变量来管理对象与 Categories 之间的关系。

private static $many_many = array(
    'Categories' => 'Categories'
);

public function getCMSFields() {

    $fields = parent::getCMSFields();

    $fields->addFieldToTab('Root.Main', ListboxField::create(
        'Categories',
        'Catégories',
        Categories::get()->map('ID', 'Title')->toArray(),
        1,
        4,
        true
    ));

    return $fields;
}

3dgoo 是正确的,您最好在此处使用 has_many 或 many_many 关系。如果出于某种原因您需要使用单个文本字段,您只需要手动向模型添加一个方法来查找那些相关记录:

public function getCategories() {
    if (empty($this->Categorie)) return null;
    return Categories::get()->filter('ID', explode(',', $this->Categorie));
}

然后您可以在模板中执行类似以下操作:

<% loop $Categories %><li>$Title</li><% end_loop %>