[英]Problem with many_many relationship with Silverstripe Fluent
[英]How to display many_many objects in page template in Silverstripe
我們的網站有一個名為“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?
您需要在兩種方式上定義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提供圖形)。
你必須在你的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示例
SilverStripe存儲many_many關系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關系管理和(更新的內容) SilverStripe課程
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.