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
Réponse acceptée

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.

Un petit soucis dans le model Uniter

public $acstAS = array('Containable');

devrait être :

public $actsAs = array('Containable');

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

pikadjou
Auteur
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
        )
)

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
Auteur
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

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
Auteur

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

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
Auteur
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

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

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

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

pikadjou
Auteur

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

pikadjou
Auteur

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

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

pikadjou
Auteur

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

Parfait alors.