J'ai une table "comments" contenant
CREATE TABLE IF NOT EXISTS `xxx_comments` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`comment` text NOT NULL,
`pseudo` varchar(50) NOT NULL,
`ip` varchar(15) NOT NULL,
`object_id` int(10) NOT NULL,
`type` varchar(50) NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
tout comme une table "notes"
CREATE TABLE IF NOT EXISTS `xxx_notes` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`note` float NOT NULL,
`ip` varchar(15) NOT NULL,
`object_id` int(10) NOT NULL,
`type` varchar(50) NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
Les 2 tables sont construites de la même manière.
Maintenant ces table sont reliés à la table photo via la clé étrangère "object_id" si le type est "Photo" et la ça se corse..
voivi la déclaration du hasMany du model "Photo".
public $hasMany = array(
'Comment' => array(
'className' => 'Comment',
'conditions' => array('Comment.type' => 'Photo'),
'foreignKey' => 'object_id'
),
'Note' => array(
'className' => 'Note',
'conditions' => array('Note.type' => 'Photo'),
'foreignKey' => 'object_id'
)
);
L'association avec les notes fonctionnent sans aucun souci, par contre avec les commentaires, je me retrouve avec cette erreur :
"Unknown column 'Comment.photo_id' in 'on clause'"
Donc il ne prend pas en compte la surcharge de la foreignKey et va chercher celle par défaut "photo_id".
1 idée de la raison??
Hello,
plusieurs pistes :
La troisième solution résoudrait en effet, mais bon, pourquoi ça fonctionne avec note et pas comment :(
le tableau hasMany peut bien prendre plusieurs entrées??
J'avais édité mon post mais comme tu as répondu entre temps, je le met ici :
Voici une autre piste :
Et apparemment oui hasMany peut prendre plusieurs entrées (apparemment parce que je suis pas un crack en Cake)
De toute façon, comme l'assocation avec note fonctionne, et que l'association est déclaré en tant que 2ème entrée du tableau hasMany, alors oui cela fonctionne :)
ma classe Comment dans le fichier Comment.php
class Comment extends AppModel {
//Association avec le rôle
public $belongsTo = 'Photo';
}
Tout semble Ok pourtant, mais il doit bien y avoir une faute de frappe quelque part, qui fait que ça ne le prend pas :(
C'est de plus en plus bizzare...
Je me suis dis que les 2 foreignKey ayant le même nom, ça pouvait poser problème dans ma table "comment" j'ai donc changer object_id en object2_id
le model photo a donc été modifé ainsi :
public $hasMany = array(
'Comment' => array(
'className' => 'Comment',
'conditions' => array('Comment.type' => 'Photo'),
'foreignKey' => 'object2_id'
),
'Note' => array(
'className' => 'Note',
'conditions' => array('Note.type' => 'Photo'),
'foreignKey' => 'object_id'
)
);
et la je me retrouve avec cette erreur
Unknown column 'Comment.object_id' in 'where clause
et la requète est :
SELECT `Comment`.`id`, `Comment`.`comment`, `Comment`.`pseudo`, `Comment`.`ip`, `Comment`.`object2_id`, `Comment`.`type`, `Comment`.`created`, `Photo`.`id`, `Photo`.`url_thumb`, `Photo`.`url`, `Photo`.`url_hd`, `Photo`.`description`, `Photo`.`name`, `Photo`.`localname`, `Photo`.`nb_display`, `Photo`.`created`, `Photo`.`modified` FROM `christopmrbd1`.`crp_comments` AS `Comment` LEFT JOIN `christopmrbd1`.`crp_photos` AS `Photo` ON (`Comment`.`photo_id` = `Photo`.`id`) WHERE `Comment`.`object_id` = '1' AND `Comment`.`type` = 'Photo'
Donc soit je suis fou, soit cake fait un peu ce qu'il veut...
Je ne pense pas que le fait d'avoir 2 fois object_id le perturbe, pas dans ce cas là en tout cas.
Le problème dans la requête SQL c'est :
`Photo` ON (`Comment`.`photo_id` = `Photo`.`id`)
Au lieu de prendre Comment.object_id, il génère un Comment.photo_id
Si je ne me trompe pas, tu peux supprimer ce comportement avec foreignKey => false.
Je ne maîtrise pas complètement ce comportement mais tu peux essayer le code ci-dessous, ça pourrait aider :
Model photo
public $hasMany = array(
'Comment' => array(
'className' => 'Comment',
'foreignKey' => false,
'conditions'=> array(
'Photo.id = 'Comment.object_id',
'Comment.type' => 'Photo'
)
),
'Note' => array(
'className' => 'Note',
'foreignKey' => false,
'conditions'=> array(
'Photo.id = 'Note.object_id',
'Note.type' => 'Photo'
)
)
);
J'espère que ça te donnera au moins une piste.
Piverte
Merci Piverte pour ton aide.
Malheureusement de mettre false voire null à foreignKey ne change strictement rien. Donc toujours au même point. :(