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.

General Questions

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

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

Return Odd DataObjects Only


Reply

4 Posts   619 Views

Avatar
DeklinKelly

7 August 2010 at 4:45am Community Member, 197 Posts

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

7 August 2010 at 5:26am Forum Moderator, 1796 Posts

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

7 August 2010 at 6:36am Community Member, 197 Posts

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

Avatar
swaiba

8 August 2010 at 12:22am Forum Moderator, 1796 Posts

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?