Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

We've moved the forum!

Please use forum.silverstripe.org for any new questions (announcement).
The forum archive will stick around, but will be read only.

You can also use our Slack channel or StackOverflow to ask for help.
Check out our community overview for more options to contribute.

Customising the CMS /

Moderators: martimiz, Sean, Ed, biapar, Willr, Ingo, swaiba

Outputing data from a many to many relationship


Go to End


3 Posts   2626 Views

Avatar
Andrew Houle

Community Member, 140 Posts

10 January 2009 at 7:00am

I'm really frustrated with an issue I'm having; logically I think I have everything in order, so I'm puzzled with what I'm doing wrong, hopefully someone can help.

Here's the basic info. I have a page type called SaturdayPage, a page type called Faculty and a data object called course. The relationships are as follows:
A SaturdayPage has many Course and a Course belongs to many SaturdayPage
A Faculty has many Course and a Course has one Faculty

All the complex table fields work and the info seems to be stored properly in the DB. Where I run into trouble is when I try to use this simple function w/in Course.php:

function getFaculty() {
      	$obj = 'Faculty';
		$sort = 'FirstName ASC';
		$filter = 'Faculty', "`ID` = '{$this->FacultyID}'";
		$join = '';
		$limit = ''; 
		$gf = DataObject::get($obj, $filter, $sort, $join, $limit);
		return  $gf;	
   }

In the database the FacultyID field is populated correctly, but this code renders nothing in the template. If I take out the $filter variable, I can populate all the Faculty objects. But even the simpliest of filters (ie "ID='1'";) breaks everything down, and I get an error.

Here is the code excerpt in the template (ScheduleHolder.ss)

<% control Children %>
            		<h2>$Header</h2>
                    <p>
                    	<% if StartDate %>$StartDate.Format(m)/$StartDate.Format(d)/$StartDate.Format(y)<% end_if %>
                    	<% if EndDate %> - $EndDate.Format(m)/$EndDate.Format(d)/$EndDate.Format(y)<% end_if %>
                        <% if SpecialComments %><br />$SpecialComments<% end_if %>
                    </p>
                    <% control Courses %>
                    	$CourseTitle
                        	<% control getFaculty %>
                            	$Name
                            <% end_control %>
                        
                    <% end_control %>
            	<% end_control %>

Please let me know any ideas you guys/gals may have. Also if it helps to show the pages and dataobject classes let me know.

Thanks in advance.

Avatar
TT

Community Member, 6 Posts

10 January 2009 at 10:03am

Edited: 10/01/2009 10:04am

I think you do not have to use a special method giving you the relation. Following snipped should work:

...
<% control Faculty %>
$Name
<% end_control %>
The control gives you the related object (because in this direction it is similar to a 1-to-1 relation)

Otherwise following statement will give you the related Faculty object:
function getFaculty() {
return $this->getComponent('Faculty');
}

Your filter does not work because it is directly taken to the WHERE clause in the SQL statement. A simple
...
$filter = 'ID = ' . $this->FacultyID;
...
should also find the correct related object.

Avatar
Andrew Houle

Community Member, 140 Posts

10 January 2009 at 10:32am

You rock, thanks for the great advice! I'm glad I asked and then walked away for a bit. Sometimes the answer should be right in front of you, but you just can't see it. How I could not try that first simple control loop is beyond me, either way... the help is much appreciated :)