【问题标题】:Multiple many_many relationships in SilverstripeSilverstripe 中的多个 many_many 关系
【发布时间】:2012-08-22 09:27:12
【问题描述】:

我只是想知道是否可以在同一个类上有多个 many_many 关系。例如,我有一个表 A、表 B 和表 C。我想要表 A 和表 B 之间的 many_many 关系以及表 A 和表 C 之间的另一个 many_many 关系。我已经尝试过了,但它没有将 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'
);
}

【问题讨论】:

  • 不,onAfterWrite 听起来不是解决此问题的正确方法。你能添加你当前的代码吗?
  • 感谢您对此@Zauberfisch 的回复。我在上面添加了与 many_many 关系相关的代码。
  • 这种关系当然是可能的,我自己有很多情况,我的关系看起来和你的一样。所以你是说关系没救了?您还可以发布如何保存关系的代码吗?你用什么来管理关系?
  • 啊,这就是我困惑的地方。我对 SilverStripe 的这个领域相当陌生,但这不应该类似于 has_one 关系吗?例如,我假设(可能是天真地)一旦我创建了一个新的表 B,ID 就会自动添加到表中。不是这样吗?
  • 好吧,是的,关系是自动保存的,但前提是您使用正确的工具。例如,ss2 中的 ManyManyComplexTableField 或 ManyManyDataObjectManager 或 ss3 中的 GridField 将保存关系

标签: silverstripe


【解决方案1】:

为了在 SilverStripe 中管理 many_many 关系,您可以使用以下字段:

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

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

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


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

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 ...');

【讨论】:

  • 抱歉,@Zauberfisch 不太清楚。第二种选择似乎是我想要的。我正在尝试这样的事情。 $Tables = DataObject::get("TableA") 因为这条线以前工作过。我想将每个商店的 ID 与新创建的表 B 的 ID 一起添加到链接表中。
  • 你明白了吗?我不确定您的评论是陈述还是问题:)
  • 不,我一直在尝试的方法没有奏效。对于这个冗长的问题,我深表歉意。我会坚持下去的。感谢您的帮助和耐心。 :)
  • 如果你仍然需要帮助,请提出一个新问题,并发布代码,我仍然不确定你真正想要做什么以及会发生什么
猜你喜欢
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多