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


Airday
Réponse acceptée

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

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
Auteur

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.

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
Auteur

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à :(

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 !

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
Auteur

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 ?

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
Auteur

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.

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

volovitz
Auteur

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'
    )
)

Ta mis la récursivité a -1 ?

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

Non et recursive=0 ne change rien :(

volovitz
Auteur

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 ;)