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.

General Questions /

General questions about getting started with SilverStripe that don't fit in any of the categories above.

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

Return Odd DataObjects Only


Go to End


4 Posts   1000 Views

Avatar
DeklinKelly

Community Member, 197 Posts

7 August 2010 at 4:45am

I use this to get 10 "Article" items, ranked by "RankingDate":

DataObject::get("Article", $q ,'RankingDate DESC','','10');

I only want ODD items to be returned. Only the 1st, 3rd, 5th, 7th and 9th item should be returned.

The MySQL query for that looks something like this:

select *
from
(select *, @rn:=@rn+1 rn
from (select @rn:=0) r, `sitetree`
WHERE `ClassName` LIKE '%Article%'
order by `Title`
limit 10
) sq
where rn%2=1

How can I do this with DataObject::get()?

Avatar
swaiba

Forum Moderator, 1899 Posts

7 August 2010 at 5:26am

How about....

$dosArticle = DataObject::get("Article", '','RankingDate DESC','','20');
$dosOnlyOddArticle = new DataObjectSet();
if ($dosArticle)
	foreach($dosArticle as $doArticle)
	{
		if($doArticle->Odd())
		{
			$dosOnlyOddArticle->push($doArticle);
		}
	}
}

Avatar
DeklinKelly

Community Member, 197 Posts

7 August 2010 at 6:36am

Thanks, swaiba. But your idea is not as kind on memory as if SQL did the work.

Avatar
swaiba

Forum Moderator, 1899 Posts

8 August 2010 at 12:22am

oh, it's didn't look like that would be an issue, but I guess you know where you need to optimise... I was always taught to get it working (whilst think of memory and CPU cycles) and then come back and address the demonstrated bottlenecks later...

why don't use directly query your datable using mysql_query or DB::query if this is a real memory hog that you want to streamline?