Soucis de jointure

Par pikadjou, il y a 13 ans


Bonjour a tous,

Cela fais 2 jours que je bloque sur une jointure, voici le code de mon controller:

$info = $this->Armee->find('first', array(
                'contain' => array(
                    'Uniter' => array(
                        'fields' => array('id', 'types_id'),
                        'Cout' => array(
                            'fields' => array('id', 'name')
                        )
                    )
                ),
                'conditions' => array('name' => $defenseur, 'Uniter.types_id' => $v),
                'fields' => array('SUM(Armee.attaque) AS attaque, SUM(Armee.defense) AS defense, SUM(Armee.vie) AS vie')
            ));

En theorie quand je fais $info'Uniter']'Cout']'id'] je devrais avec quelque chose... mais la je n ai rien :s

Voici le model Uniter:

class Uniter extends AppModel{

    public $acstAS = array('Containable');

    public $hasMany = array(
            'Armee' => array(
                'foreignKey' => 'uniters_id'
            )
    );
    public $belongsTo = array(
            'Cout' => array(
                    'className' => 'Cout',
                    'foreignKey' => 'types_id'
            ),
            'Tete' => array(
                    'className' => 'Artefact',
                    'foreignKey' => 'tete'
            ),
            'Gauche' => array(
                    'className' => 'Artefact',
                    'foreignKey' => 'gauche'
            ),
            'Droite' => array(
                    'className' => 'Artefact',
                    'foreignKey' => 'droite'
            ),
            'Corps' => array(
                    'className' => 'Artefact',
                    'foreignKey' => 'corps'
            ),
            'Pied' => array(
                    'className' => 'Artefact',
                    'foreignKey' => 'pied'
            ),
            'Bonus' => array(
                    'className' => 'Artefact',
                    'foreignKey' => 'pied'
            )
        );
}

et du model cout:

class Cout extends AppModel{

     public $actsAs = array('Containable');

     public $hasMany = array(
            'Uniter' => array(
                'className' => 'Uniter',
                'foreignKey' => 'types_id'
            )
    );
}

Vouyez vous ou cela coince?

Merci d avance et bonne fin de we.

Pikadjou

16 réponses

Digikube, il y a 13 ans

Un petit soucis dans le model Uniter

public $acstAS = array('Containable');

devrait être :

public $actsAs = array('Containable');
coloo, il y a 13 ans

As-tu spécifié la variable uses dans ton controller ?

pikadjou, il y a 13 ans
public $uses = array('Armee', 'Combat', 'Uniter', 'Cout');

voici ma variable uses

Pour le

public $actsAs = array('Containable');

je l ai mis a jour mais rien,

Voici ce que me donne le debug:

Array
(
    [0] => Array
        (
            [attaque] => 10
            [defense] => 10
            [vie] => 0
        )
    [Uniter] => Array
        (
            [id] => 18
            [types_id] => 5
        )
)
Digikube, il y a 13 ans

Essaies :

$this->Armee->contain('Uniter','Cout');
$info = $this->Armee->find('first',array('fields' => array('Uniter.id', 'Uniter.type_id', 'Cout.id', 'Cout.name')));

Et debug $info pour voir maintenant ?

pikadjou, il y a 13 ans
Model "Armee" is not associated with model "Cout"

Ce qui est logique car le model Cout est lier seulement avec Uniter et Uniter avec Armee

Digikube, il y a 13 ans

Ah pardon j'avais pas compris comme ça.
Et en essayant :

$this->Armee->recursive = 2;
$info = $this->Armee->find('first',array('fields' => array('Uniter.id', 'Uniter.type_id', 'Cout.id', 'Cout.name')));
pikadjou, il y a 13 ans

Ce que je trouve special cest que lorsque je fais cela:

$info = $this->Uniter->find('first', array(
            'contain' => array(
                'Cout'
            )
       ));

J'obtiens bien:

Array
(
    [Uniter] => Array
        (
            [id] => 25
            [types_id] => 4
            [tete] => 
            [droite] => 
            [gauche] => 
            [corps] => 
            [pied] => 
            [bonus] => 
            [or] => 100
            [nourriture] => 100
            [bois] => 200
            [pierre] => 200
            [chevaux] => 0
            [maintenance_or] => 30
            [maintenance_nourriture] => 30
            [attaque] => 15
            [defense] => 10
            [vitesse] => 10
            [vie] => 5
        )
    [Cout] => Array
        (
            [id] => 4
            [name] => infanterie
            [or] => 100
            [nourriture] => 100
            [bois] => 200
            [pierre] => 200
            [chevaux] => 0
            [PC] => 0
            [villageois] => 1
            [attaque] => 15
            [defense] => 10
            [vie] => 5
            [vitesse] => 10
            [maintenance_or] => 30
            [maintenance_nourriture] => 30
        )
)

Ce qui veut donc dire que le jointure fonction bien entre Uniter et Cout pourtant dans:

$info = $this->Armee->find('first', array(
                'fields' => array('SUM(Armee.attaque) AS attaque, SUM(Armee.defense) AS defense, SUM(Armee.vie) AS vie'),
                'contain' => array(
                    'Uniter' => array(
                        'fields' => array('id', 'types_id'),
                        'Cout' => array(
                            'fields' => array('id', 'name')
                        )                        
                    )
                ),
                'conditions' => array('name' => $defenseur, 'Uniter.types_id' => $v)                
            ));

Elle ne fonctionne plus donc je pense que c est moi qui est du faire une faute mais ou :s

Digikube, il y a 13 ans

Ah ah psq il manque le "contain" au niveau de Uniter non ?

$info = $this->Armee->find('first', array(
                'fields' => array('SUM(Armee.attaque) AS attaque, SUM(Armee.defense) AS defense, SUM(Armee.vie) AS vie'),
                'contain' => array(
                    'Uniter' => array(
                        'fields' => array('id', 'types_id'),
                        'contain' => array(
                            'Cout' => array(
                                'fields' => array('id', 'name')
                            )
                        )                    
                    )
                ),
                'conditions' => array('name' => $defenseur, 'Uniter.types_id' => $v)               
            ));
pikadjou, il y a 13 ans
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Uniter.contain' in 'field list'
SQL Query: SELECT SUM(`Armee`.`attaque`) AS attaque, SUM(Armee.defense) AS defense, SUM(Armee.vie) AS vie, `Uniter`.`id`, `Uniter`.`types_id`, `Uniter`.`contain` FROM `armees` AS `Armee` LEFT JOIN `uniters` AS `Uniter` ON (`Armee`.`uniters_id` = `Uniter`.`id`) WHERE `name` = 'armee-test-0' AND `Uniter`.`types_id` = 5 LIMIT 1
Digikube, il y a 13 ans

Grrr ... à ce moment là tu peux essayer :

$this->loadModel('Uniter');
$this->Uniter->contain('Cout');

Tu récupères tes infos en deux fois.

pikadjou, il y a 13 ans

j'ai mis ceci:

$this->loadModel('Uniter');
            $this->Uniter->contain('Cout');

            $info = $this->Armee->find('first', array(
                'fields' => array('SUM(Armee.attaque) AS attaque, SUM(Armee.defense) AS defense, SUM(Armee.vie) AS vie'),
                'contain' => array(
                    'Uniter' => array(
                        'fields' => array('id', 'types_id'),
                        'Cout' => array(
                                'fields' => array('id', 'name')
                        )                  
                    )
                ),
                'conditions' => array('name' => $defenseur, 'Uniter.types_id' => $v)                
            ));

Mais rien :s

Digikube, il y a 13 ans

Négatif chef ... Fais 2 requêtes :

$armee = $this->Armee->find('first', array(
                'fields' => array('Armee.attaque','Armee.defense','Armee.vie','Uniter.id','Uniter.type_id'),          
            ));
$this->loadModel('Uniter');
$this->Uniter->contain('Cout');
$uniter = $this->Uniter->find('all', array(
                'fields' => array('Uniter.id','Uniter.type_id','Cout.id','Cout.name'),          
            ));

Il y a certainement une condition à rajouter dans la 2ème requête.

pikadjou, il y a 13 ans

Ha oui je vois le systeme que tu veux utiliser, un enorme merci pour l aide en tout cas.

Digikube, il y a 13 ans

Pas de soucis est-ce que ça marche au moins sinon je sert pas a grand chose ;)

pikadjou, il y a 13 ans

je testerai demain mais je ne vais pas utilise ce que tu as dis mais le meme genre et je suis quasi sur que ca va fonctionner =D

Digikube, il y a 13 ans

Parfait alors.