Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

j'ai trois tables une supports(id,nom) l'autre configurations(id,config,support_id,ville_id) et l'autre geolocalisations(id,configuration_id)

voici le contenu des tables de mon models

SupportsTable

 public function initialize(array $config)
    {
        parent::initialize($config);

        $this->table('supports');
        $this->displayField('id');
        $this->primaryKey('id');

        $this->addBehavior('Timestamp');

        $this->hasOne('Configurations', [
            'foreignKey' => 'support_id',
            'dependent'  => true,
            'className' => 'Configurations',
            'cascadeCallbacks' => true
        ]);

    }

ConfigurationsTable

public function initialize(array $config)
    {
        parent::initialize($config);

        $this->table('configurations');
        $this->displayField('id');
        $this->primaryKey('id');

        $this->addBehavior('Timestamp');
        $this->addBehavior('CounterCache', ['Villes' => ['configuration_count'],'Supports' => ['configuration_count']]);

        $this->belongsTo('Supports', [
            'foreignKey' => 'support_id',
            'joinType' => 'INNER'
        ]);

        $this->belongsTo('Villes', [
            'foreignKey' => 'ville_id',
            'joinType' => 'INNER'
        ]);

        $this->hasMany('Geolocalisations', [
            'foreignKey' => 'configuration_id'
        ]);
    }

GeolocalisationsTable

 public function initialize(array $config)
    {
        parent::initialize($config);

        $this->table('geolocalisations');
        $this->displayField('id');
        $this->primaryKey('id');

        $this->addBehavior('Timestamp');
        $this->addBehavior('CounterCache', ['Users' => ['geolocalisation_count'], 'Annonceurs' => ['geolocalisation_count'], 'Configurations' => ['geolocalisation_count'], 'Villes' => ['geolocalisation_count'], 'Arrondissements' => ['geolocalisation_count']]);

        $this->belongsTo('Users', [
            'foreignKey' => 'user_id',
            'joinType' => 'INNER'
        ]);
        $this->belongsTo('Annonceurs', [
            'foreignKey' => 'annonceur_id',
            'joinType' => 'INNER'
        ]);
        $this->belongsTo('Configurations', [
            'foreignKey' => 'configuration_id',
            'joinType' => 'INNER'
        ]);
        $this->belongsTo('Villes', [
            'foreignKey' => 'ville_id',
            'joinType' => 'INNER'
        ]);
        $this->belongsTo('Arrondissements', [
            'foreignKey' => 'arrondissement_id',
            'joinType' => 'INNER'
        ]);
        $this->belongsTo('Quartiers', [
            'foreignKey' => 'quartier_id',
            'joinType' => 'INNER'
        ]);
    }

Ce que je veux

dans mon controlleur GeolocalisationsControlleur, lorsque je fait ceci:

 $this->loadModel("Administration.Configurations");

        $supports = $this->Configurations->find()
                          ->contain(['Supports'])
                          ->all();

j'ai bel et biens tous mes data biens récupérées
mais si par contre je fait ceci:

 $this->loadModel("Administration.Geolocalisations");

        $supports = $this->Geolocalisations->Configurations->find()
                          ->contain(['Supports'])
                          ->all();

Ce que j'obtiens

Configurations is not associated with Supports

pourtant lorsque je fait

 $this->loadModel("Administration.Configurations");

        $supports = $this->Configurations->find()
                          ->contain(['Supports'])
                          ->all();

j'ai bien mes résultats quelqu'un à une idée?

SVP

6 réponses


romses
Auteur
Réponse acceptée

Merci pour tous ceux qui ont essayé de trouver une solution pour moi, j'ai résolumon problème en injectant le SQL directement dans l'application (datasource)

A mon avis il te faut créer une association de type HasAndBelongsToMany.
Car si je comprends bien ton problème, il fait l'association dans un sens mais pas dans l'autre. Et toi tu veux les deux sens ?

romses
Auteur

je ne pense pas vraiment en effet la table configuration contient l'id du support, la table geolocalisation contient l'id de configuration comme une transitivite donc ce que je veux faire c'est avoir les résultats des support depuis la table geolocalisation

je ne sais pas si vous avez compris

Bonsoir.
Tu devrais regarder dans la documentation : Eager Loading des Associations Via Contain.
Exemple :

$query = $articles->find()->contain([
    'Authors' => ['Addresses'], 'Comments' => ['Authors']
]);
// ou via la notation par point
$query = $articles->find()->contain([
    'Authors.Addresses',
    'Comments.Authors'
]);
romses
Auteur

Justement @Lartak,

voici ce que j'ai d'abord utilisé la notation par point

$supports = $this->Geolocalisations->find()
                          ->contain(['Configurations.Supports'])
                          ->all();

et toujours le même résultat: Configurations is not associated with Supports

romses
Auteur

ce que je n'arrive pas a comprendre c'est le pourquoi en fesant $this->Configurations->Supports() j'ai bien le résultat attendu; mais lorsque je fait le $this->Gelocalisations->Configurations->Supports() on me dit que Configurations et Supports ne sont pas liées pourtant ici $this->Configurations->Supports() on voit bien la liaison