Bonjour,

Je développe actuellement un projet, et j'ai un petit souci qui se présente. J'ai enfin toute ma structure en place, mes models, mes controllers, et je m'attaque donc aux liaisons, et là c'est le drame !

J'ai deux models en HABTM, et très logiquement une table de jointure qui leur permet de se retrouver les uns les autres.

Premier model :

class Elevage extends AppModel {
        var $actsAs = array('Containable');
        var $hasAndBelongsToMany = array(
        'Groupe' => array(
            'classname' => 'groupe',
            'foreignKey' => 'elevage_id',
            'assocationForeignKey' => 'groupe_id',
            'fields' => array('nom', 'id')
        )
    );

}

Second model :

class Groupe extends AppModel {
        var $actsAs = array('Containable');
        var $hasAndBelongsToMany = array(
        'Elevage' => array(
            'classname' => 'elevage',
            'foreignKey' => 'groupe_id',
            'assocationForeignKey' => 'elevage_id',
            'fields' => array('nom', 'id', 'slug', 'description')
        )
    );

}

Actuellement, je travaille sur le controller Elevage que voici :

class ElevageController extends AppController {

    function index() {
        $this->Elevage->contain('Groupe');
        $d'elevage'] = $this->Elevage->find('all', array(
            'fields' => array('id', 'nom')
        ));

        debug($d);
        $this->set($d);
    }
}

Et le souci, c'est qu'à l'affichage des résultats, l'array contient bien le ou les groupes liés, mais aussi et surtout les données de la table de liaison, et c'est vraiment gênant. Pourtant, j'ai bien précisé les champs que je souhaitent récupérer, et j'ai eu beau chercher sur le net, aucune trace d'une erreur du genre.

Voici un débug de résultats :

Array
(
    [elevage] => Array
        (
            [0] => Array
                (
                    [Elevage] => Array
                        (
                            [id] => 1
                            [nom] => Test
                        )
                    [Groupe] => Array
                        (
                            [0] => Array
                                (
                                    [nom] => Federation
                                    [id] => 9
                                    [GroupesElevage] => Array
                                        (
                                            [id] => 1
                                            [elevage_id] => 1
                                            [groupe_id] => 9
                                        )
                                )
                            [1] => Array
                                (
                                    [nom] => Plante
                                    [id] => 10
                                    [GroupesElevage] => Array
                                        (
                                            [id] => 650
                                            [elevage_id] => 1
                                            [groupe_id] => 10
                                        )
                                )
                        )
                )
    }

A noter que le même problème se produit dans l'autre sens, quand on est dans Groupes et qu'on obtient les élevages via le containable.

Si quelqu'un a une idée, merci d'avance ! :)

3 réponses


Pakito
Auteur
Réponse acceptée

Maintenant que l'application s'est complété et a évolué et qu'il existe des liaisons partout et dans tous les sens, les tables de liaisons ont bien disparu des tableaux de résultats.

Le problème s'est donc résolu de lui-même.

A noter qu'entre temps, la version de Cake a été mise à jour.

Salut,
Tu as tout simplement oublié de définir le niveau de récursivité dan ton model.
Si tu ajoutes la ligne :

public $recursive = -1;

Tu n'auras plus la fameuse liaison.

Pakito
Auteur

Etant donné que je définis le comportement containable, j'ai la main quand je fais mes find() en lui passant les liaisons attachées que je souhaite obtenir.

Le souci vient du fait que dans les données de liaisons, j'ai non seulement les groupes attachés à l'élevage, et ça c'est ce que je souhaite, mais j'ai aussi un array supplémentaire à l'intérieur de chacun des groupes retournés qui contient les infos de l'enregistrement qui fait la liaison dans la fameuse table de liaison.

Pour exemple, quand je cherche mon élevage et que j'obtiens comme premier item :

Array
(
    [elevage] => Array
        (
            [0] => Array
                (
                    [Elevage] => Array
                        (
                            [id] => 1
                            [nom] => Test
                        )

                    [Groupe] => Array
                        (
                            [0] => Array
                                (
                                    [nom] => Federation
                                    [id] => 9
                                    [GroupesElevage] => Array
                                        (
                                            [id] => 1
                                            [elevage_id] => 1
                                            [groupe_id] => 9
                                        )

                                )

L'index "GroupesElevage" n'a rien à faire dans l'index Groupe qui est trouvé, puisqu'il s'agit de la table de liaison.
J'ai cherché sur la doc, sur les tutos, et également sur le tuto Grafikart sur HABTM, et aucun d'entre eux ne reçoit la table de liaison en plus des données souhaitées.

C'est là que le problème se trouve.