我们的网站有一个名为" TrailNotice"与页面类型有很多关系" TrailSection"。
class TrailNotice extends DataObject {
private static $many_many = array(
'TrailSections' => 'TrailSection'
);
这允许通过CMS中的复选框在多个TrailSections中应用单个TrailNotice:
$fields->addFieldToTab('Root.Main', new CheckboxSetField('TrailSections', 'Applies to which trail sections?', DataObject::get('TrailSection')->map('ID', 'Title')));
如何在TrailSection页面控制器中显示附加到TrailSection的TrailNotices?
我从以下代码开始:
class TrailSection_Controller extends Page_Controller {
public function TrailNotices(){
$TrailNotices = DataObject::get('TrailNotice');
return $TrailNotices;
}
但是这将获得所有TrailNotice对象。如何过滤它们以便只显示附加到TrailSection的TrailNotices?
答案 0 :(得分:7)
您需要在两种方式上定义many_many,然后您可以从两侧访问它。一方有$many_many
class TrailNotice extends DataObject {
private static $many_many = array(
'TrailSections' => 'TrailSection'
);
另一方面,您必须定义$belongs_many_many
class TrailSection extends DataObject {
private static $belongs_many_many = array(
'TrailNotices' => 'TrailNotice'
);
然后在你的模板中你可以调用关系列表并循环遍历它:
<% loop $TrailNotices %>
$Title
<% end_loop %>
请参阅了解所有可能的关系(感谢@nightjar提供图片)。
答案 1 :(得分:3)
你必须在你的TrailSection模型中实现$ belongs_many_many,就像这样:
class TrailSection extends DataObject {
private static $belongs_many_many = array(
'TrailNotices' => 'TrailNotice'
);
}
然后你可以简单地将$ TrailNotices循环到TrailSection.ss模板中,而不对你的控制器做任何事情:
<% loop $TrailNotices %>
$Title<br>
<% end_loop %>
您可以在Stephen的链接Dataobject Relationship Management
中查看Mentor示例答案 2 :(得分:0)
SilverStripe存储了许多关系RelationList,可以使用$this->RelationName()
(在这种情况下为$this->data()->TrailNotices()
)访问该对象。 RelationList是DataList的子类,所以你可以像对DataObject::get()
那样对它进行过滤来过滤列表。
class TrailSection_Controller extends Page_Controller {
public function TrailNotices(){
$TrailNotices = $this->data()->TrailNotices();
return $TrailNotices;
}
有关SilverStripe的ORM和DataObject关系的更多信息,请参阅帮助部分Dataobject Relationship Management和(较新的内容)SilverStripe Lessons