IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Doctrine2 PHP Discussion :

Comment accéder à l'entityManager dans une entity


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Par défaut Comment accéder à l'entityManager dans une entity
    Je suis pas très clair dans mon sujet. Alors je vous explique ce que je cherche à réaliser. J'ai 2 entités :
    • User
    • Missions

    avec une relations 1->N (càd qu'un utilisateur possède plusieurs missions).
    Chaque missions à :
    • une date de début
    • une date de fin

    Je souhaite ajouter dans mon entité "User" une méthode "getDateDisponible" qui recherche la date de fin de la dernière mission. Je voulais donc pour se faire exécuter une requête SQL qui me retournerait la date de fin maximum. Mais je pèche sur la façon pour récupérer l'entityManager dans ma classe User afin d'éxécuter ma requête SQL.

    Une idée ?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    495
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 495
    Par défaut
    je pense que cet exemple de la doc répond a ta question :

    tu definis ta fonction sur mesure dans le repository

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?php
    namespace MyDomain\Model;
     
    use Doctrine\ORM\EntityRepository;
     
    /**
     * @entity(repositoryClass="MyDomain\Model\UserRepository")
     */
    class User
    {
     
    }
     
    class UserRepository extends EntityRepository
    {
        public function getAllAdminUsers()
        {
            return $this->_em->createQuery('SELECT u FROM MyDomain\Model\User u WHERE u.status = "admin"')
                             ->getResult();
        }
    }
    et tu l'appelles dans tes controleurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    // $em instanceof EntityManager
     
    $admins = $em->getRepository('MyDomain\Model\User')->getAllAdminUsers();
    non ?

  3. #3
    Membre éclairé Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Par défaut
    bah en fait c'est pas tout à fait ce que je cherche.
    De ce que j'ai compris en vulgarisant beaucoup, les repositories sont là pour manipuler des collections d'objets entity

    Moi je cherche plutôt à accéder à une propriété d'un objet entity. La différence avec ce que l'on trouve dans les exemples, c'est que cette propriété n'est pas stockée en base de donnée. Elle est calculée à partir de règles métier qui dans ce cas font appel à une requête SQL.

    Sinon en écrivant ses lignes, je me dis que je peux peut-être ajouter un champs "dispoAt" et à chaque fois que je fais un insert dans la table mission, je met à jour se champs. Avec les lifeCycleCallback et un listener.

    Qu'en pensez vous ?

    Je pense que je pêche plus sur la conception que sur la réalisation sur le coup.

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,

    Tu peux toujours créer une méthode getDateDispo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    //User
    /**
    *@var DateTime
    **/
    protected $dateDispo;
     
    public function getDateDispo(){
     if(null===$this->dateDispo){
       $missionsIndexedByDateFin=array();
       foreach($this->getMissions as $mission){
          $missionsIndexedByDateFin[$mission->getDateFin()->getTimestamp()]=$mission;
       }
        $missionsIndexedByDateFin=krsort($missionsIndexedByDateFin);
        foreach($missionsIndexedByDateFin as $mission){
           $this->dateDispo=$mission->getDateFin();
           break;
        }
      }
      return $this->dateDispo;
    }
    évidemment ce n'est pas trés optimisé puisque l'on charge toute les entités Missions, mais tu peux aussi récupérer cette valeur directement en DQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //UserRepository
     
    public function findUserWithDateDispo($id){
       $dql="SELECT u,MAX(m.dateFin) FROM User u JOIN u.missions m WHERE u.id=:id";
     
       $result=$this->_em->createQuery($dql)->setParameter($id)->getSingleResult();
       //$result est tableau dont le premier index est l'entité User et le second le champ calculé.
      $user=$result[0];
      $dateDispo=$result[1];
     
      $user->setDateDispo($dateDispo):
      return $user;
    }
    Aprés si tu as souvent besoin d'accéder à cette valeur et donc d'accélérer les traitements, c'est également possible de stocker cette valeur dans la base comme tu le proposes,
    c'est d'ailleurs ce que suggère la doc de Doctrine:
    http://www.doctrine-project.org/blog...te-fields.html
    Mais avec cette méthode il y a plus de risque que la donnée "dateDispo" soit mal synchronisé, il faut penser à tout les cas de figure et n'accéder à ta base que via Doctrine .

  5. #5
    Membre éclairé Avatar de guiyomh
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 328
    Par défaut
    Bonjour merci pour ce retour.

    C'est ce que je cherchais. Je vais essayer avec le repository qui (je pense) va limité les problème de cohérence de donnée.

    Sinon le lien que tu donnes pour les aggregate field est très intéressant. J'essayerais par la suite si le repository ne me convient pas.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] comment utiliser le service container dans une entity
    Par bilbi dans le forum Symfony
    Réponses: 3
    Dernier message: 11/06/2012, 15h26
  2. Comment accéder aux données d'une Map contenue dans une autre Map
    Par leeti dans le forum Collection et Stream
    Réponses: 15
    Dernier message: 27/05/2011, 23h35
  3. Réponses: 4
    Dernier message: 04/08/2010, 13h08
  4. comment ecrire du texte dans une window application
    Par gaut dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 16/07/2003, 10h23
  5. Comment stocker un ficher dans une table postgres
    Par josoft dans le forum Requêtes
    Réponses: 3
    Dernier message: 23/06/2003, 16h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo