SilverStripe 3.1 ListboxField将数组保存到数据库

时间:2015-10-14 16:04:19

标签: silverstripe

我想知道如何正确保存使用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中的变量?

2 个答案:

答案 0 :(得分:3)

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 %>

答案 1 :(得分:2)

使用$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;
}