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.

-~----------~----~----~----~------~----~------~--~---

Responder a