Bonjour,
j'ai deux model (User et Follow) j'aimerais avoir accès à User.id dans le model Follow par exemple :

public function follow() {
     $user=$this->User->find('first',
         array(
           'conditions' => array('User.id'=>'$id'),
           'fields' => array('User.id','User.nom')));
           debug($user);
           $this->set('user',$user);

      if($this->request->is('post')){
      $d = $this->request->data;
      debug($this->request->data);
       if( $this->Follow->save(array('pseudo'=>$d'Follow']'pseudo'],'email'=>$d'Follow']'email'],'user'=>$id)))
         {
        $this->Session->setFlash("la suivie de cette eglise ou congréation est active,","notif");
        $this->redirect('/users/login');
         }else{
              $this->Session->setFlash("Veuillez remplir tous les champs. merci","notif");
             }
        }
    }

Quelle procédures je dois utiliser?
merci

19 réponses


freezlike
Réponse acceptée

arf j'pensais que tu m'avais compris erreur de ma part alors le bout d'code pour la classe d'association tu le met quand la requête est posté sinon ça ne vas s'enregistrer en base de données je n'ai pas ton projet en phase de moi mais assure toi d'avoir dans ton controlller dans ta variable

public $uses = array('FollowUser','Follow');

c'est être sûr de l'appel des models

ou bien encore puisque y a le relationnel

$this->Model->UnAutreModel

donc assure toi de tout ça avant.

Cordialement.

Hello,

Grâce au relationnel, dépendant des deux models
si j'ai deux tables users et follows (suivant les normes cakephp)
exple :
Users
id username password
follows
id blabla user_id

dans le model Follow.php j'aurais

<?php
App::uses('AppModel', 'Model');
class User extends AppModel {
    public $belongsTo = array(
        'Follow' => array(
            'className' => 'Follow',
            'foreignKey' => 'user_id'
            /**
            * si besoin d'indiquer des conditions ce genre de chose t'ajoute 
            */
            //'conditions' => '',
            //'fields' => '',
            //'order' => ''
        )
    );
}

voilà j'espère t'avoir aider si j'ai raté quelque chose tu n'a répondre ou sinon expose les 3 couches (model view et action(du controller)) pour mieux comprendre

Cordialement.

wenz
Auteur

Merci pour avoir vite répondu,
c'est dans la model Follow que je dois ecrire tes indications ou dans le model User?
puisque quand je l'ai ecri dans le model Follow j'ai cette erreur :
Fatal Error

Error: Cannot redeclare class User

Je t'en prie,

il faut que t'ajoute la variable belongsTo dans ton model User

juste ça

public $belongsTo = array(
        'Follow' => array(
            'className' => 'Follow',
            'foreignKey' => 'user_id'
            /**
            * si besoin d'indiquer des conditions ce genre de chose t'ajoute 
            */
            //'conditions' => '',
            //'fields' => '',
            //'order' => ''
        )
    );

mais là je suis un peu confus peut-tu m'expliquer en cardinalité la relation entre User et Follow (en uml)

1 => { User a plusieurs Follow et Follow a un seul User}
ou
2 => { User à un seul Follow et Follow à plusieurs User}

parce que l'accès sera assurer par deux variables relationnels $belongsTo et $hasMany mais il faudrait savoir c'est le cas 1 ou 2 ?

Cordialement.

wenz
Auteur

User c'est encore une eglise et Follow c'est encore un adhérent
une eglise peut être suivie par plusieurs adhérent et et un adhérent peut suivre plusieurs eglises.voilà

donc Eglise hasMany Adhérent et Adhérent hasMany Eglise

donc
pour la classe User

public $hasMany = array(
        'Follow' => array(
            'className' => 'Follow',
            'foreignKey' => 'user_id',
            'dependent' => false
        )
    );

pour la classe Follow

public $hasMany = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id',
            'dependent' => false
        )
    );

Test avec ça parce que je n'ai pas la moindre idée de comment ta crée tes tables en base de données

ps : si ça marche et je pense que ça va marcher continue avec la doc pour approfondir et comprendre la logique en suivant ce lien

Cordialement.

wenz
Auteur

ok cool,
mais quand je fais debug($user) dans mon controllers user que j'ai posté en haut ça m' affiche juste array c'est normal?
merci

avant toute chose vérifie dans ta base de données pour voir si réellement tout les champs sont rempli et surtout la clé user_id dans la tables follows ou adherents si ça t'a affiche que array c'est pas normal si c'est le cas il faut plus d'information pour détecter la source du problème

parce que là j'vois

$user=$this->User->find('first',array(
           'conditions' => array('User.id'=>'$id'),
           'fields' => array('User.id','User.nom')));
           debug($user);
           $this->set('user',$user);

le $id il vient d'où ? dans ce cas normal que l'array est empty il n'y pas d'id c'est pour ça.

normalement la methode follow elle prend l'id
genre

public function follow($id = null){
    //Ton traitement 
}

Cordialement.

wenz
Auteur

$id c'est le champ id de la table User

wenz
Auteur

Dans ma table Follow tous les champs sont remplis sauf le champ User_id,
voici la syntaxe de ma table User

--
-- Structure de la table `users`
--
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `eglise` varchar(255) NOT NULL,
  `nom` varchar(255) NOT NULL,
  `pasteur` varchar(255) NOT NULL,
  `adresse` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `email1` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `username` varchar(255) NOT NULL,
  `created` datetime NOT NULL,
  `lastlogin` datetime NOT NULL,
  `active` int(11) NOT NULL DEFAULT '0',
  `visuel` varchar(255) NOT NULL,
  `phone` varchar(255) NOT NULL,
  `site` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
--
-- Contenu de la table `users`
--

Table Follow:

--
-- Structure de la table `follows`
--
CREATE TABLE IF NOT EXISTS `follows` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `pseudo` varchar(255) NOT NULL,
  `phone` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `user_id` varchar(255) NOT NULL,
  `created` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
--
-- Contenu de la table `follows`
--

Je suis un peu perdu je ne sais plus d'où vient l'erreur.
merci

Bonjour,

déjà pourquoi ton user_id est il en varchar je sais pas si l'orm le tolère mais ça se peut mais t'aurais du le mettre en int en php si ça passe en 1 ou '1' peut être que cake ça lui provoque un conflit bref je relis tout ça et là je me dis hier j'étais mal en point en te disant hasMany hasMany c'est plusieurs à plusieurs avant que j'écrive n'importe quoi pour être sûr toi tu veux que avec une église tu peut afficher tout les followers ? et avec un follower tu peut afficher les églises qu'il suit ?

wenz
Auteur

avec une eglise je veux afficher tout les followers qui suit cette eglise.

donc faudra changer pour ça cake à une norme comme en UML une relation plusieurs à plusieurs fait naître une classe d'association tu va devoir créer une table comme ceci

CREATE TABLE `follows_users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `follow_id` int(11) NOT NULL,
 `user_id` int(11) NOT NULL,
 PRIMARY KEY (`id`)
)

après ça tu enlève le user_id

et pour le relationnel tu va créer un model nommé FollowUser.php

<?php
App::uses('AppModel', 'Model');
class FollowUser extends AppModel {
    public $useTable = 'follows_users';
    public $belongsTo = array(
        'Follow',
        'User' => array(
            /**
             * cela va te permettre d'avoir le nombre de followers pour chaque église
             * ajoute en BDD un champ pour la table follows_users un champ follow_count de type int qui sera remplie automatiquement
             */
            'counterCache' => 'follow_count '
        )
    );
    public function afterDelete() {
        parent::afterDelete();
        $this->User->deleteAll(array(
            'User.follow_count' => 0
        ));
    }
}

maintenant si je suis un follower et que à partir d'une action j'veux suivre une église, coté controller ça sera

//on passe l'id du follower + l'id de l'église
public function follow($id = null,$idUser = null){
    if(!empty($id) && !empty($idUser){
        $this->FollowUser->create();
        $this->save(array(
            'id' => null, //pour être juste sûr de l'autoincrement
            'follow_id' => $id,
            'user_id' => $idUser
        ));
    }
}

à partir de la table follows_users (classe d'association)
tu peut avoir les followers de chaque église
à partir de la table users tu peut avoir le nombre de followers pour chaque église via le champ follow_count
et là tout tes problèmes sont résolu à partie de là je peux pas t'aider plus que ça le reste c'est de l'extraction de données simple
bon courage et bonne chance pour ton projet

Cordialement.

wenz
Auteur

merci , je teste et je te reviens

wenz
Auteur

freezlike merci pour le soutient mais j'ai encore une question le traitement du formulaire pour l'ajout des followers doit se faire normalement sur model Follow et la création du formulaire sur la view follow du controllers Follow oubien?
je pose cette question parce que j'aimerais savoir le rôle du model FollowUser.merci

Hello,

je t'en prie, alors pour :
"le traitement du formulaire pour l'ajout des followers doit se faire normalement sur model Follow et la création du formulaire sur la view follow du controllers Follow"

réponse => oui !
ps : si par traitement d'ajout tu veux dire la validation tout ça alors oui oui !

comme je t'ai dis juste avant la relation qui unit tes deux models c'est plusieurs à plusieurs sans le model FollowUser tu ne vas pas avoir des informations comme euh ?

  • pour chaque église je veux la liste des followers

  • pour chaque follower quel église il suit

    cette classe va répondre à la logique que tu instaure en liant les models (users & follows), comme je t'ai décris ce model qui sert de classe d'association entre User & Follow qui va te servir comme un porteur d'informations vu que sur les tables mères (users & follows) tu ne peut pas stocké de tel informations comment ?
    genre si tu laisse user_id tu vas pas avoir pour chaque id de user, user_id contenant la liste des followers par exple ce n'est pas faisable c'est pour ça qu'une classe d'association résout ton problème voilà, j'étais bien long à l'explication j'espère que ce n'était pas SUPRA barbant.

Cordialement.

wenz
Auteur

ok merci freezlike,mais j'ai un autre problème dans la table FollowUser les champs sont vides normalement ça doit se rempli automatique, oubien je me trompe.
et dans la table Follow je ne recupère pas l'id de User mais 0 comme valeur.
merci

$this->save(array(
            ''id' => null, //pour être juste sûr de l'autoincrement
            'follow_id' => $id,
            'user_id' => $idUser
        ));

j'ai oublié de mettre le model avant save(...

donc ça devient

$this->FollowUser->save(array(
            'id' => null, //pour être juste sûr de l'autoincrement
            'follow_id' => $id,
            'user_id' => $idUser
        ));

Cordialement.

wenz
Auteur

Merci pour ta réponse j'ai corrigé ça avant,
voici mon le code de mon controllers Follow:

class FollowController extends AppController {

    public function index($id = null,$idUser = null) {
    if(!empty($id) && !empty($idUser)){
        $this->FollowUser->create();
        $this->FollowUser->save(array(
            'id' => null, //pour être juste sûr de l'autoincrement
            'follow_id' => $id,
            'user_id' => $idUser
        ));}
     if($this->request->is('post')){ 
      $d = $this->request->data;

        $this->Follow->create();
       if( $this->Follow->save(array('pseudo'=>$d'Follow']'pseudo'],'email'=>$d'Follow']'email'])))
         {

        $this->Session->setFlash("la suivie de cette eglise ou congréation est active,","notif");
        $this->redirect('/users/login');
         }
         }else{
              $this->Session->setFlash("Veuillez remplir tous les champs. merci","notif");
             }

        }
}

j'ai oublié quelques choses ou il y a une erreur quelque part?
merci