Silverstripe中有多个many_many关系

时间:2012-08-22 09:27:13

标签: silverstripe

我只是想知道是否可能在同一个类上有多个many_many关系。例如,我有一个表A,表B和表C.我想要表A和表B之间的多个关系以及表A和表C之间的另一个多关系。我试过这个,但它没有将ID添加到它创建的表。我做了一些搜索并找到了这个http://www.balbuss.com/multiple-many-many-s-of-the-same-class/,我不确定它现在是否可能。

非常感谢任何帮助。

我考虑过使用onAfterWrite来填充链接表,但是我应该这样做吗?

class Table B extends DateObject {
static $belongs_many_many = array (
    'TableAs' => 'TableA'
);
}

class Table C extends DateObject {
static $belongs_many_many = array (
    'TableAs' => 'TableA'
);
}

class Table A extends Page {
    static $many_many = array (
    'TableB' => 'TableB',
    'TableC' => 'TableC'
);
}

1 个答案:

答案 0 :(得分:1)

用于管理SilverStripe中的many_many关系,您可以使用以下字段:

ss2.4:ManyManyComplexTableFieldManyManyDataObjectManager,两者都提供该类型所有记录的列表,让您选择与复选框的关系

ss3.0:GridField,但您可能需要添加自己的复选框,不确定

同样,在2.4和3.0中都有一些下拉字段和其他支持many_many关系的字段(例如TreeMultiselectField


我不确定你在注释中“遍历TableA的每个实例”是什么意思,如果你只想循环所有TableA,这些TableAs被分配给TableB的单个记录,那么你可以这样做:

foreach ($tableBrecord->TableAs($filter = "", $sort = "", $join = "", $limit = "") as $tableArecord) {
   // do something with $tableArecord
}

但是如果你真的想在TableA的所有记录上做一些事情,那么你可以这样做:

foreach(DataObject::get('TableA', $filter = "", $sort = "", $join = "", $limit = "") as $tableArecord) {
   // do something with $tableArecord
}

如果你有很多TableA记录,这可能有点慢,所以你也可以这样做本机查询

 DB::query('UPDATE TableA SET ...');