cricket, It's not about just 'union'. I don't want to be dealing with cakephp style quering here. I am talking about plain sql query. Passing a pure mysql query into pagination. I did it, and it worked. The problem however is when I am trying to go with reqular CakePHP pagination within the same controller, for a differect action. Because when I override those 2 functions, they now work for all the actions in that controller (I overcame this problem as well-> in that controller I simply use plain sql in all paginations). Worked for me.
What I wonder is why not let people insert pure sql when needed into pagination, why force everyone to go through tedious cakephp style arraying sqls (with condition arrays, etc.)? My method works, but how to enable or "disable" it per action of the same controller? On Jan 23, 2:06 pm, cricket <[email protected]> wrote: > On Sun, Jan 23, 2011 at 11:16 AM, mmamedov <[email protected]> wrote: > > OK. This is getting weird. > > Now it works for custom query, but it doesn't work when I need default > > pagination for other actions of the same controller. > > > The problem is however, with the overriding paginate() and > > paginateCount() - Cake 1.3 manual and the source code of both, are > > different. > > > In Cake manual,http://book.cakephp.org/view/1237/Custom-Query-Pagination, > > it says: > > function paginate($conditions, $fields, $order, $limit, $page = > > 1, $recursive = null, $extra = array()) { ... } > > But in the source code I see: > > function paginate($object = null, $scope = array(), $whitelist > > = array()) { ...} > > > So which one is it? And I also seem unable to find paginateCount() > > definition in source code (At least that's what Netbean's Find is > > uinable to find) > > You're looking at the wrong class. Controller has a paginate() method, > but Model::paginate() will be called if it exists. Sorry, it's not > precise to say that you're overriding the method in the model. Better > to say that you're including it. Look at Controller::paginate > again.http://api.cakephp.org/view_source/controller/#line-1052 > > Line 1181 is where $scope gets folded into $conditions. Line 1197 is > where it checks if your model has a paginateCount() and calls it if > so. Line 1215 is where Model::paginate() is looked for. > > > > > BTW, this is how I defined them in my model: > > > function paginate($conditions=null, $fields=null, $order=null, > > $limit=null, $page = 1, $recursive = null, $extra = array()) { > > if (isset($conditions['sql'])) > > { > > $recursive = -1; > > $query = $conditions['sql']; > > unset($conditions['sql']); > > $query .= ' LIMIT '.($page-1)*$limit.','.$limit; > > > return $this->query($query); > > } > > else{ > > return parent::paginate($conditions, $fields, $order, > > $limit, $page,$recursive, $extra); > > } > > > } > > function paginateCount($conditions = null, $recursive = 0, > > $extra = array()) { > > if (isset($conditions['sql'])) > > { > > $sql = $this->mmPaginateCount; //I assign this from > > controller, i need it this way. > > $results = $this->query($sql); > > return $results[0][0]['c']; > > } > > else{ > > return parent::paginateCount($conditions, $recursive, > > $extra); > > } > > > } > > > And this is how I settup custom plain sql from controller before > > calling $this->paginate(); > > > $this->paginate=array( > > 'limit'=>Configure::read('Page.PostCount') //my appwide limit for > > posts > > ,'conditions'=>array( > > 'sql' =>"my custom query")); > > > Any thoughts? > > If you're defining $paginate as a class var (outside of the action) > you could instead just change certain keys in $this->paginate, rather > than re-defining the entire array. Like limit, for example. > > Also, the conditions could be defined within Model::paginate. If you > need to pass certain values you could do so in the $scope array in the > controller. As in your example: > > $scope = array('union' => array('Friend.user_id' => 99)); > > $data = $this->paginate('hatever', $scope); > > In the model: > > if (exists($scope['union'])) > { > $conditions = array_merge($conditions, $scope['union']); > > This allows you to pass several params within one. You could even do > this in the controller: > > $scope = array( > 'union' => array( > 'conditions' => array( > 'Friend.user_id' => 99 > ), > 'limit' => 10, > 'order' => array( > 'Friend.last_name' => 'ASC' > ) > ) > ); > > And then sort it out as necessary inside the model. > > The 'union' key is arbitrary. It could be 'foo' or whatever. -- Our newest site for the community: CakePHP Video Tutorials http://tv.cakephp.org Check out the new CakePHP Questions site http://ask.cakephp.org and help others with their CakePHP related questions. To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/cake-php
