Salut à toutes et à tous!

Je reviens avec mon système d'évènements :)
J'ai une table "events" et une table "users" qui sont reliées avec une table "events_users".
J'ai un tableau qui liste tous les évènements avec pour chacun un bouton qui permet de s'inscrire.
Sachant que j'ai l'id du user grâce à la session/Auth et que j'ai l'id de l'event,
comment je peux faire pour insérer cette liaison dans la table?

Exemple :
Ma table "events_users" comporte les champs id, user_id et event_id.
Donc en gros je veux pouvoir enregistrer/lier le user_id 10 à l'event_id 5 par l'action d'un bouton "inscription.
ça m'a l'air relativement simple mais je ne vois absolument pas comment m'y prendre.

Je n'ai pas mis de code, pour l'instant on parle plutôt de la façon de procéder.

Je vous remercie d'avance pour votre aide!

6 réponses


LivinInChina
Auteur
Réponse acceptée

Bon ça y est, problème enfin réglé!
Si quelqu'un rencontre des problèmes avec les associations de modèles, je lui conseille fortement d'aller jeter un oeil sur la partie formation de grafikart plus particulièrement celle des associations modèles dans cakephp.
En gros c'est résolu grâce à plusieurs choses à paramétrer.
D'une il faut associer les tables dans les 2 modèles, pour mon cas :
Modèle User

<?php
class User extends AppModel{
    public $hasAndBelongsToMany = array('Event');
    public $hasMany = array('EventUser');
}

Modèle Event

<?php
class Eventextends AppModel{
    public $hasAndBelongsToMany = array('User ');
    public $hasMany = array('EventUser');
}

Modèle EventUser

<?php
class EventUser extends AppModel {

    public $useTable = 'events_users';
    public $belongsTo = array('Event', 'User');
}

Eh oui, comme vous l'aurez certainement remarqué, il faut créer un modèle pour la table de liaison et indiquer un belongs to des tables à laquelle elle appartient. Pareillement pour les table event et user, on indique qu'elles ont un hasMany EventUser.
De là toutes les requêtes les plus folles sont ouvertes ^^

En espérant que ça en aidera d'autres :)

Merci à tous les 2 en tout cas pour votre aide et votre réflexion, ça m'a fait avancer dans la bonne voie.

Tu peux créer une function inscription dans ton EventController ou UserController comme tu veux en faisant passer en paramètre l'id de ton utilisateur et l'id de ton évènement un peu comme ça :

$this->Html->link('Inscription', array(
    'controller' => 'events', // ou users
    'action' => 'inscription',
    $this->Auth->user('id'),
    $event_id
))

Salut Flourt, merci encore à toi ^^

Ok pour le lien, je vois bien comment faire passer en param les id.
Ensuite pour la sauvegarde, je fais un truc du genre :

function register($user_id, $event_id){
    // ici je vérifie que les 2 id existent
    // Si tout est bon je sauvegarde
    if($this-save($this->request->data){
        $this->setFlash('Inscription réussi');
    }
}

J'ai simplifié mais est-ce que je suis dans le bon? Tout s'enregistrera automatiquement dans la table de liaison "events_users"?

Personnellement, je ferais un JOIN Model à ta place, car tu auras certainement besoin d'ajouter des informations à cette liaison.

User hasMany Participation
Event hasMany Participation
Participation belongsTo User
Participation belongsTo Event

Maintenant, dans le controller ParticpationsController.php tu dois pouvoir créer facilement ta fonction.

Salut amethyste et merci pour ta réponse. Je préfère conserver ma liaison HABTM vu que je l'utilise dans les controllers pour d'autres actions, ce serait embêtant de tout refaire.

En gros j'ai un lien :

$this->Html->link("S'inscrire", array('controller'=>'events','action'=>'registration', $v'id']), array('class' => 'available','title'=>"S'inscrire à cet évènement"));

Comme l'id de l'event passe par l'url, je le récupère dans mon controller comme suit pour ensuite enregistrer une nouvelle entrée dna ma table de liaison events_users :

function event_registration($event_id){
        $user_id = $this->Auth->user('id');
        if (!$user_id) {
            $this->Session->setFlash("Vous devez être connecté pour vous inscrire", "notif", array('type' => 'error'));
            $this->redirect(array('controller' => 'users', 'action' => 'login'));
        }
        $data = array(
            'event_id' => $event_id,
            'user_id' => $user_id,
            );
        if ($this->EventsUser->save($data, true, array('event_id', 'user_id'))) {
            $this->Session->setFlash("Votre inscription a bien été enregistré","notif");
            $this->redirect(array('controller' => 'events', 'action' => 'event_index'));
        }else{
            $this->Session->setFlash("Un problème est survenu lors de la sauvegarde","notif",array('type'=>'error'));
            $this->redirect(array('controller' => 'events', 'action' => 'event_index'));
        }
    }

Bien évidemment ça ne fonctionne pas vu que "EventsUser" de $this->EventsUser->save() n'est pas un modèle existant mais symbolise ma table pour cet exemple. Donc ma question est la suivante, comment puis je faire pour sauvegarder le event_id et le user_id dans une nouvelle entrée de ma table de liaison events_users sachant que ce sont les 2 seules données à enregistrer?

Je vous remercie par avance de votre aide!

Si tu es dans ton Eventscontroller tu peux utiliser

$this->Event->EventsUser->save($data, true, array('event_id', 'user_id'));