Bonjour, bonsoir,

je suis actuellement la formation cakephp dans la mise en place du système d'abonnement , et de l'abonnement à un animal je récupéère l'erreur suivante :

Database Error
Error: SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'user_id' in where clause is ambiguous

SQL Query: SELECT COUNT(*) AS count FROM petsy.subscriptions AS Subscription LEFT JOIN petsy.pets AS Pet ON (Subscription.pet_id = Pet.id) LEFT JOIN petsy.users AS User ON (Subscription.user_id = User.id) WHERE pet_id = 1 AND user_id = 2

J'ai beau chercher je ne trouver pas comment régler ce problème.
La requête correspond exactement à ma demande pourtant =/

voici le code :

public function subscribe($pet_id){
        $this->Pet->id = $pet_id;
        if(!$this->Pet->exists()){ //si cet animal n existe pas
            throw new NotFoundException();
        }
        $conditions = array(
                'pet_id' => $pet_id,
                'user_id'=> $this->Auth->user('id')
        );
        $this->loadModel('Subscription');
        $count = $this->Subscription->find('count', array(
            'conditions'=> $conditions
        ));
        if($count > 0){
            $this->Session->setFlash('Vous êtes déjà abonné à cet animal', 'flash', array('class'=>'error'));
        }else{
            $this->Subscription->save($conditions);
            $this->Session->setFlash('Vous êtes désormais abonné à cet animal', 'flash', array('class'=>'succes'));     
        }
        return $this->redirect($this->referer());
    }

Une idée svp ?

5 réponses


amethyste
Réponse acceptée

Dans les liaisons faites par cakephp, il trouve plusieurs champs (dans plusieurs tables) appelés "user_id".
Du coup tu dois préciser le modèle dans tes conditions.

$conditions = [
    'Subscription.pet_id' => $pet_id,
    'Subscription.user_id'=> $this->Auth->user('id')
];
Bomber
Auteur

Merci,
J'avais essayé une première fois, en ne précisant que pour le user_id , et ça m'avait renvoyé un message d'erreur (dont je ne me rappel plus).
Du coup pour les deux ca fonctionne nickel

Merci bien =)

Bomber
Auteur

En faite mon problème n'est pas résolu finalement;
Car ca me fait bien une nouvelle entrée dans ma table mais pet_id et user_id on la valeur 0 une idée pourquoi ?

Oui, pour enregistrer, cakephp attend un format différent de celui que tu lui donnes dans $conditions. Du coup il crée un enregistrement vierge. Voilà le format attendu :

Array
(
    [NomDuModele] => Array
    (
        [nomduchamp1] => 'valeur'
        [nomduchamp2] => 'valeur'
    )
)
Bomber
Auteur

ca ne fontionne pas non plus : ca me retourne l'erreur

Warning (2): Illegal offset type [APP\Controller\PetsController.php, line xx]

et lorsque je retire les crochets il cherche le champs subscritption =(