Vérifier si un user est contenu dans la requête

Par volovitz, il y a 12 ans


Bonsoir,

Je suis embêté avec une requête pour vérifier si la fiche que je souhaite récupérer correspond bien à l'utilisateur.

J'ai une table contenant des interventions liées à un ou plusieurs serveurs. Chaque serveur appartient à un utilisateur.

Voilà le retour d'un find first classique :

array(
  'Intervention' => array(
    'id' => '7',
    'created' => '2014-01-16 16:59:02',
    'updated' => '2014-01-16 16:59:02',
    'type' => 'technique',
    'dateprevue' => '2014-01-16 18:00:00',
    'daterealisee' => null,
    'etat_serveur' => true,
    'details_serveur' => '',
    'etat_maj' => true,
    'details_maj' => '',
    'etat_securite' => true,
    'details_securite' => '',
    'duree_planifiee' => '1',
    'duree_realisee' => null,
    'demande_initiale' => 'Test',
    'etat_demande' => true,
    'details_demande' => '',
    'comment' => ''
  ),
  'InterventionsServer' => array(
    (int) 0 => array(
      'id' => '3',
      'intervention_id' => '7',
      'server_id' => '1'
    )
  ),
  'Server' => array(
    (int) 0 => array(
      'id' => '1',
      'user_id' => '5',
      'host_id' => '1',
      'identity' => 'nsXXX.ovh.net',
      'name' => 'Plesk',
      'InterventionsServer' => array(
        'id' => '3',
        'intervention_id' => '7',
        'server_id' => '1'
      )
    )
  )
)

Comment faire dans les conditions du find pour lui dire : "si un serveur a pour user_id = 5" ?
Quelqu'un aurait la solution svp ?

Merci d'avance

15 réponses

christophe4427, il y a 12 ans

Dans la doc tu as ça :

$specifiquementCeluiCi = $this->Article->find('first', array(
        'conditions' => array('Article.id' => 1)

Si tu mets ça :

$specifiquementCeluiCi = $this->Server->find('first', array(
        'conditions' => array('Server.user_id' => $user_id)

Il me semble que ça devrait fonctionner ?

volovitz, il y a 12 ans

Oui, tu as raison mais pour mon problème.

La difficulté est de récupérer la fiche intervention souhaitée (ex: Intervention.id=7) et de vérifier en même temps que l'utilisateur qui veut voir cette fiche a bien un serveur sur cette intervention (ex: Server.user_id=5).

Mais comme Server est un array contenant plusieurs serveurs, je n'ai pas trouvé comment faire directement dans la requête.

christophe4427, il y a 12 ans

Moi quand je trouve pas, je fais une query, après c'est violent et à utiliser en cas de "J'ai aucune solution possible"

volovitz, il y a 12 ans

Oui, j'ai déjà eu recours au query mais c'est vraiment à proscrire :D

Je vais voir, si personne n'a de solution je devrais en arriver là :(

christophe4427, il y a 12 ans

Oui c'est ce que je te dis "En cas de j'ai pas de solution" ^^
Désolé du coup je t'aide pas trop bon courage !

amethyste, il y a 12 ans

Quand tu dis:

l'utilisateur qui veut voir cette fiche a bien un serveur sur cette intervention

tu parles d'un utilisateur connecté ?

Je pense qu'il faut d'abord vérifier si cet user à un server dans le model Server.php : si oui ca retourne l'id du server, sinon ca retourne false. Ensuite, tu fais ta requete ou pas.

volovitz, il y a 12 ans

Oui, je parle bien de l'utilisateur connecté.
Mais comment tu fais pour vérifier que dans la liaison il y a un serveur qui correspond à un utilisateur ?

amethyste, il y a 12 ans

Je pensais à faire la requête plutôt sur le model Server

<?php 
    $servers = $this->Server->find('all', array(
        'conditions'=>array('Server.user_id'=>AuthComponent::user('id'))
    ));

?>

la dedans il doit bien y avoir les interventions de ces servers. Et ces servers appartiennent seulement à l'utilisateur connecté.

volovitz, il y a 12 ans

J'y ai pensé aussi mais ça n'empêche pas que je ne peux pas faire un find:first avec l'id de l'intervention.

Puisque le but est de verifier que l'utilisateur est bien concerné par la fiche d'intervention qu'il consulte à cet instant.

Airday, il y a 12 ans

Au lieu de faire un find sur Intervention, fait le plutot sur InterventionsServer, à tester :p

volovitz, il y a 12 ans

Le problème c'est que je n'arrive pas à obtenir les détails interventions et servers.

Le model InterventionsServer :

<?php
class InterventionsServer extends AppModel {

    public $belongsTo = array('Intervention', 'Server');

}

La requête :

$this->InterventionsServer->find('first', 
    array(
        'conditions' => 
            array(
                'InterventionsServer.intervention_id' => $id
            )
    )
);

Résultat :

array(
    'InterventionsServer' => array(
        'id' => '4',
        'intervention_id' => '8',
        'server_id' => '1'
    )
)
Airday, il y a 12 ans

Ta mis la récursivité a -1 ?

$this->InterventionsServer->find('first',
    array(
        'conditions' =>
            array(
                'InterventionsServer.intervention_id' => $id
            ),
        'recursive' => 0
    )
);
volovitz, il y a 12 ans

Non et recursive=0 ne change rien :(

Airday, il y a 12 ans

Et dans tes models Server et Intervention y a t il une relation hasmany vers InterventionsServer ?

volovitz, il y a 12 ans

Ok, j'avais oublié cette relation :(

Je n'avais ajouté dans mon modèle que la relation HABTM :

public $hasAndBelongsToMany = array('Intervention');

Merci pour ton aide ;)