Bonjour à tous !

Voici mon soucis.
J'ai une table users avec un champ 'role'. Les valeurs possibles sont (dev et design)
Une table categories avec un champ 'slug'. Les valeurs possibles sont les mêmes.
J'ai une table projects liée à categories, elle contient donc un champ category_id.

Je récupère le role de l'utilisateur dans une variable $role ainsi que son niveau (expert, debutant...) dans une variable $level

J'aimerai lister les projets qui correspondent au niveau de l'utilisateur ainsi qu'a son rôle. Par exemple un designer ne peut pas voir les projets des developpeurs et vice versa.
Il faut donc récupérer les projects qui ont un level égal à $level && que le cateroy_id correspond à l'id de la catégorie ayant pour slug $role

En gros un bout de code comme ça :

function dev_find(){
        $level = $this->Auth->user('level');
        $role = $this->Auth->user('role');
        $d'projects'] = $this->Project->find('all',array(
            'conditions'=> array(
                'online' =>1,
                'Project.level'=> $level,
                'Project.category_id' => array( // La on selection l'id de la catégorie
                    'Category.id' => array(     
                        'slug' => $role // qui a pour slug $role
                    ) 
                )
            )
        ));
        if(empty($d'projects'])){
            $this->Session->setFlash(__("Aucun projet de votre niveau ou de votre catégorie n'est ouvert"), "notif", array('class' => 'danger'));
        }
        //debug($d);
        $this->set($d);
    }

Evidemment ce code ne fonctionne pas et je vois pas trop comment faire :/
Quelqu'un aurait une idée ?

5 réponses


Salut, pourrais tu nous décrire les deux tables (categories et projects) et un debug de $this->Auth->user :) stp

Je pense que la solution serait celle-ci, si j'ai bien compris ce que tu recherches :

$options'conditions'] = array('category_id'=>$role,'online'=>1,'level'=>$level);
$this->Project->find('all',$options);

En principe, les champs category_id de ton projet et rôle de ton user devraient tous les deux faire référence à l'id de la table category, à moins que tu utilises le slug comme id ?

Ah tiens ta solution Piverte me fait penser à ce que j'ai fait en version "Brutal genre Pikachu VS JCVD"

J'ai fait ça pour ma solution perso en gros je récupère toutes les histoires d'un utilisateurs connecté qui est contributeur de cette histoire et qui ne voit donc pas les autres histoires en cours, etc, etc.

//Récupération de toutes les valeurs de la table Contributeur
        $listeDesContributeursParHistoire = $this->StoryContributeurs->find('all');
        //Affinage de la recherche des histoires en ne prenant que celles où l'utilisateur
        //connecté est enregistré.
        $listeHistoireContributeurUserConnecte = $this->StoryContributeurs->find('all',array('conditions' => array('StoryContributeurs.id_user' => $user_id)));
        //Recherche des infos du l'histoire en fonction de l'ID de l'histoire.
        $listeHistoireContributeurUserConnecteUserExiste = $this->Stories->query(
                'SELECT * 
                FROM stories, story_contributeurs, categories
                WHERE stories.id = story_contributeurs.id_story
                AND stories.id_category = categories.id
                AND story_contributeurs.id_user='.$listeHistoireContributeurUserConnecte[0]'StoryContributeurs']'id_user']
                );

Essaye de cette façon :

$this->loadModel('Category');
$this->Category->find('first', array(
    'conditions' => array('Category.slug' => $slug),
    'contain' => array(
        'Project' => array(
            'conditions' => array(
                'Project.online' => true,
                'Project.level' => $level)))));

Ça devrait te retourner un tableau qui ressemble à cela :

array(
    'Categoy' => array(
        'id' => 1,
        'name' => 'Dev',
        'slug' => 'dev'),
    'Project' => array(
        0 => array(
            'id' => 1,
            'name' => 'Projet 1',
            'level' => 'expert',
                        'category_id' => 1
        ),
        1 => array(
            'id' => 2,
            'name' => 'Projet 2',
            'level' => 'expert',
                        'category_id' => 1
        )
    )
);
SwithFr
Auteur

Bonsoir,

finalement j'ai trouvé une solution alternative en modifiant un peu la strucuture de mes tables mais sinon je pense que ta solution était la meilleure GyZmo.

Encore merci à vous.