Hola a todos, tengo un problema a la hora de filtrar una consulta en una relación HABTM, a ver si me podéis echar una mano. Aviso: Es un poco largo lo que he escrito
Primero explico qué tengo montado: DDBB ---- videos: id (primary_key), titulo genres: id (primary_key), nombre videos_genres: video_id, genre_id (ambas primary_key) MODELOS ------- class Video extends AppModel { var $name = 'Video'; //The Associations below have been created with all possible keys, those that are not needed can be removed var $hasAndBelongsToMany = array( 'Genre' => array('className' => 'Genre', 'joinTable' => 'videos_genres', 'foreignKey' => 'video_id', 'associationForeignKey' => 'genre_id', 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', 'unique' => '', 'finderQuery' => '', 'deleteQuery' => '', 'insertQuery' => '') ); } class Genre extends AppModel { var $name = 'Genre'; var $validate = array( 'section_id' => VALID_NOT_EMPTY, 'nombre' => VALID_NOT_EMPTY, ); //The Associations below have been created with all possible keys, those that are not needed can be removed var $hasAndBelongsToMany = array( 'Video' => array('className' => 'Video', 'joinTable' => 'videos_genres', 'foreignKey' => 'genre_id', 'associationForeignKey' => 'video_id', 'conditions' => '', 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', 'unique' => '', 'finderQuery' => '', 'deleteQuery' => '', 'insertQuery' => ''), ); } class VideosGenre extends AppModel { var $name = 'VideosGenre'; var $primaryKey = array('video_id', 'genre_id'); //The Associations below have been created with all possible keys, those that are not needed can be removed var $belongsTo = array( 'Genre' => array('className' => 'Genre', 'foreignKey' => 'genre_id', 'conditions' => '', 'fields' => '', 'order' => '', 'counterCache' => ''), 'Video' => array('className' => 'Video', 'foreignKey' => 'video_id', 'conditions' => '', 'fields' => '', 'order' => '', 'counterCache' => ''), ); } Mi intención es que en un método del controlador Videos, que para este caso he llamado genres, obtener todos los videos de un genero en concreto. A continuación el código de ese método (hasta el momento dos simple lineas para testar): function genres(){ $videos = $this->paginate(); pr($videos); } La llamada a este método me devuelve todos los videos, como es de suponer. Para tratar de obtener únicamente los videos de un género en particular, he provado de añadir un bindModel para especificar unas condiciones, tal que así: $this->Video->bindModel (array ( 'hasAndBelongsToMany' => array ( 'Genre' => array ( 'className' => 'Genre', 'joinTable' => 'videos_genres', 'foreignKey' => 'video_id', 'associationForeignKey' => 'genre_id', 'conditions' => array( 'VideosGenre.genre_id'=>2 ), 'order' => 'id DESC', 'uniq' => false, 'finderQuery' => '', 'deleteQuery' => '', 'insertQuery' => '' ) ) )); Con esta llamada no consigo, nada (sigo obteniendo el listado completo de videos) y he ido provando diferentes 'conditions' por si no estaba haciéndolo correctamente. Mirando los SQL de debug que se muestran en pantalla y mostrando el modelo (mediante un pr($this->Video)), me he dado cuenta que el bindModel no está siquiera actuando, he llegado a poner un bindModel('hasMany') inventado y el volcado del modelo no me lo muestra como una relación creada. He llegado a provar de poner un 'className' incorrecto, en este caso da un error de Modelo no encontrado, o sea, que la llamada al bindModel se realiza. Tras esto he decidido poner las condiciones directamente en el modelo, a ver que sucedía. Extracto de la modificación en el modelo Videos: 'Genre' => array('className' => 'Genre', 'joinTable' => 'videos_genres', 'foreignKey' => 'video_id', 'associationForeignKey' => 'genre_id', 'conditions' => array('VideosGenre.genre_id'=>2), 'fields' => '', 'order' => '', 'limit' => '', 'offset' => '', 'unique' => '', 'finderQuery' => '', 'deleteQuery' => '', 'insertQuery' => ''), Esta modificación en el modelo si que tiene su efecto, y es que me devuelve todos los videos pero los videos que no pertenecen a ese género (en este caso el 2) la información referente al género está vacía. A continuación un ejemplo de la información de uno perteneciente y de uno no perteneciente. [2] => Array ( [Video] => Array ( [id] => 4 [titulo] => película 1 perteneciente al género acción ) [Genre] => Array ( [0] => Array ( [id] => 2 [nombre] => Acción ) ) ) [3] => Array ( [Video] => Array ( [id] => 5 [titulo_original] => película 2 NO perteneciente al género acción ) [Genre] => Array ( ) ) He provado diferentes maneras de especificar las condiciones, sin conseguir más que el resultado anterior. Y viendo los SQL resultantes no es de extrañar, por que la condición la especifica en una consulta que, a mi parecer, no es la adecuada. Para más información pongo a continuación las SQL. SELECT `Video`.`id`, `Video`.`titulo` FROM `videos` AS `Video` WHERE 1 = 1 LIMIT 20 SELECT `Genre`.`id`, `Genre`.`nombre`, `VideosGenre`.`video_id`, `VideosGenre`.`genre_id` FROM `genres` AS `Genre` JOIN `videos_genres` AS `VideosGenre` ON (`VideosGenre`.`video_id` IN (2, 3, 4, 5) AND `VideosGenre`.`genre_id` = `Genre`.`id`) WHERE `VideosGenre`.`genre_id` = 2 Después de toda esta parrafada, me pregunto, primero por qué no funciona el especificar una condición en el bindModel llamado desde un método del controlador y segundo, ¿cómo puedo hacer para obtener los videos de un género en particular?. Estoy bastante perdido provando diferentes posibilidades (he estado mirando los foros en inglés con poca suerte) y puede que sea algo muy sencillo que no estoy viendo o que me he equivocado a la hora de generar las relaciones. En fin, agradecería mucho que alguien se mirará este problema y me diera alguna pista o quizás la solución. Es posible que alguien se haya encontrado con esta situación en particular y haya podido resolverla de alguna forma o sirva si se soluciona como información útil. Gracias por adelantado, Israel --~--~---------~--~----~------------~-------~--~----~ Has recibido este mensaje porque estás suscrito a Grupo "CakePHP-es" de Grupos de Google. Si quieres publicar en este grupo, envía un mensaje de correo electrónico a CakePHP-es@googlegroups.com Para anular la suscripción a este grupo, envía un mensaje a [EMAIL PROTECTED] Para obtener más opciones, visita este grupo en http://groups.google.com/group/CakePHP-es?hl=es. -~----------~----~----~----~------~----~------~--~---