jueves, 6 de marzo de 2008

Problemas con bindable y paginate en CakePHP

Últimamente tuve un poco de problemas con los binds y la función paginate de la nueva versión de el marco de trabajo cakephp, la 1.2.

Mi problema surgía cuando quería buscar todos los posts que estuvieran asociados a un tag específico, pero sólo quería traer la relación que el post tenía con Usuario y no la relación con Comentarios. Buscando por ahí me encuentra con una respuesta del Sr. Mariano Iglesias, que dice que la función paginate rehace las relaciones (por esta razón cualquiera unbindModel no funcionaría). En este enlace se puede encontrar información sobre el behavior Bindable. En mi caso la solución fue la siguiente:
  • Creo app_model.php y le agrego:
    var $actsAs = array('Bindable');
  • El método en el controlador post quedó así:
    function tag($id = null){
    if (!$id) {
    $this->Session->setFlash(__('Invalid Tag.', true));
    $this->redirect(array('action'=>'index'));
    }
    $this->layout = 'blog';
    // $this->Post->unbindModel(array('hasMany' => array('TrackPost', 'Comentario'), 'hasAndBelongsToMany' => array('Tag')));
    $this->Post->restrict(false, 'Usuario');
    /*$this->Post->bindModel(array('hasAndBelongsToMany' => array('Tag' => array(
    'joinTable' => 'posts_tags',
    'foreignKey' => 'post_id',
    'associationForeignKey' => 'tag_id',
    'unique' => false,
    'conditions' => 'Tag.id = '.$id)
    )
    ));*/
    $this->Post->Tag->recursive = 2;
    $this->set('existSession', $this->existSession());
    //$this->set('posts', $this->Post->Tag->find(array('Tag.id' => $id)));
    $this->set('posts', $this->paginate('Tag', array('Tag.id' => $id)));
    $this->Post->resetBindable(true);
    }
  • Lo interesante está en las siguientes líneas:
    • $this->Post->restrict(false, 'Usuario'); : esta línea restringe a que Post solo tengo relación con Usuario y el parámetro false hace que todos los cambios que haz hecho de relaciones sean permanentes.
    • $this->Post->resetBindable(true); : reseteo las relaciones para que funcionen como estaban.
Bueno con esto resolví mi problema. Saludos ...

No hay comentarios: