【问题标题】:Themeing a one to many relationship主题化一对多关系
【发布时间】:2026-01-31 19:45:02
【问题描述】:

我正在 Silverstripe 中建立一对多关系并尝试为其设置主题,但我无法在页面上获得许多部分。对象上的 has_many 定义为:

public static $has_many = array(
    'PortsPages' => 'PortsPage'
);

当我尝试使用循环遍历它时

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

只有一条记录返回($Title 什么都没有 - $Name 随 PortsPage 返回 - 不是对象的标题),尽管数据库中有 2 条记录。我相信我使用的是 3.1 版,并且我已经通过 http://doc.silverstripe.org/framework/en/tutorials/5-dataobject-relationship-management,这对我没有帮助(并且尚未更新为最新版本)。

编辑:

$has_one 定义如下:

private static $has_one = array(
    'CityPage' => 'CityPage'
);

当我查看 PortsPage 表时,链接似乎在其中(有一个 CityPageID 列已填充并且看起来正确)。当我查看 PortsPage_Live 时,未填充 CityPageID 列。

【问题讨论】:

  • 它是 以 s 结尾?
  • 我试过了 - 不产生 li 标签( 产生 1)。
  • 数据库中有 2 并不意味着这 2 在您的页面上实际链接(关系的一部分)。请添加“s”。
  • 如果它们出现在页面上,它们应该是链接。但最好的调试方法是使用 phpmyadmin 或其他方式查看 MySql 中的 DB 表,每个 PortsPage 上应该有一个PageID 或其他一些外键。另外,请确保您的 PortsPage 定义了正确的反向 has_one 关系,否则它将无法正常工作:doc.silverstripe.org/framework/en/topics/datamodel#has-many
  • 你在发布数据吗?

标签: silverstripe


【解决方案1】:

如果您使用的是 SilverStripe 3.1 版,您需要将静态变量设置为“私有”而不是“公共”。

schellmax 指出缺失的“s”是正确的。

$Title 仅在您的 DataObject "PortsPage" 将其作为其对象属性之一时才会返回。

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

此外,如果您在 SiteTree 中的 PortsPages 是根级页面的直接子级,您可以使用 在模板引擎中访问它们。

【讨论】:

  • PortsPage 对象继承自 Page(当我查看页面模板时,它有一个元素 Title)。我已将变量设置为私有,并且 $PortsPages 仍然不返回任何条目:-(
  • 您尝试在哪种页面类型上创建关系?是 Page has_many PortsPages 吗? SilverStripe 中对于包含其他页面类型的页面类型的通常约定是将它们命名为 Holder,例如 PortsHolder。你有这些持有者之一吗?
  • 我不确定持有人是否是我想要实现的目标的正确答案。最终,港口之间(以多对多方式)以及城市之间(一个城市有多个港口)之间可能会有联系。
【解决方案2】:

虽然 Cam 是正确的编程解决方案,但事实证明我的错误在于它们没有在管理端正确链接。

虽然我从城市中选择了港口,但我仍然需要进入每个单独的港口并保存并发布它们(尽管我认为在链接它们之前我已经发布了它们)。

告诉我的是,我查看 PortsPage 页表中的 CityPageID 列是正确的,但是当我查看 PortsPage_Live 表时,CityPageID 列仍然为 0。

【讨论】: