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
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');
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 ?
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')));
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)
));
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.
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
Ha oui je vois le systeme que tu veux utiliser, un enorme merci pour l aide en tout cas.
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