Get Related Pages, or: Filter By Many_Many Relation
On our Slack community channel today one question was, how to get all other pages with the same tags like the current page. The solution - once you found it - seems to simple to be true.
We have a Page class with a many_many to our RelationTags like:
<?php class Page extends SiteTree { private static $many_many = array( 'Relationtags' => 'Relationtag' ); public function getCMSFields() { $fields = parent::getCMSFields(); $field = TagField::create( 'Relationtags', 'Tags', Relationtag::get(), $this->Relationtags() ) ->setShouldLazyLoad(true) // tags should be lazy loaded ->setCanCreate(true); // new tag DataObjects can be created $fields->addFieldToTab('Root.Main', $field); return $fields; } }
And of course the Tag Dataobject with the reverse $belongs_to:
<?php class Relationtag extends DataObject { private static $db = array( 'Title' => 'Varchar(200)', ); private static $belongs_many_many = array( 'Pages' => 'Page' ); }
Now how can we get all other Pages with the same tags? Our getter might look like this:
public function getRelatedcontent(){ return Page::get()->filter('Relationtags.ID', $this->Relationtags()->column('ID'))->exclude('ID', $this->ID); }
This way we get all other pages with at least one similar tag from our database.
This solution was tested in SilverStripe 3.5 and might work in previous versions.
Post your comment
Comments
No one has commented on this page yet.
RSS feed for comments on this page | RSS feed for all comments