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

7 réponses


Hello,

plusieurs pistes :

  • vérifie que le type de la colonne object_id dans notes/comments soit le même type que l'id de ta photo
  • vérifier que tes colonnes dans ta base de données ne comportent pas des caractères en majuscules puisque tes champs dans ton model sont en minuscules (apparemment vu le create table ça semble correct mais une petite vérif' ne fait pas de mal)
  • modifier le nom de ta colonne object_id en photo_id, ça ne résout pas d'où vient le problème mais ça va régler ton soucis
  • Ce sont tout les 3 des int(10)
  • J'ai reverifié, il ne semble pas y avoir de souci, de toute façon les create table ci dessus sont créé via un export de la structure des tables dans la BD, donc pas d'erreur de recopie

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 :

  • vérifier que ton modèle dédié aux commentaires se nomme bien "Comment", et pas "Comments" par exemple.

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. :(