我只是想知道是否可能在同一个类上有多个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'
);
}
答案 0 :(得分:1)
用于管理SilverStripe中的many_many关系,您可以使用以下字段:
ss2.4:ManyManyComplexTableField
或ManyManyDataObjectManager
,两者都提供该类型所有记录的列表,让您选择与复选框的关系
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 ...');