Bonjour à tous,



J'ai une entité Contact ManyToOne Personne et une entité Compte ManyToOne Société.

J'aimerai afficher sur la gauche de mon écran, une liste des derniers éléments consultés (grâce à une date de consultation que j'ai en attribut), qui sont les contacts et les comptes.

J'effectue donc cette requête dans mon PersonneRepository :

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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
 
/**
 *
 * @return array : 10 derniers éléments consultés dans un tableau
 */
public function getElementsRecents()
{
    $em = $this->getEntityManager();
 
    $rsm = new ResultSetMappingBuilder($em);
    $rsm->addRootEntityFromClassMetadata('IcmeMainBundle:Personne', 'p');
    $rsm->addRootEntityFromClassMetadata('IcmeMainBundle:Societe', 's', array(
        'id' => 'idSociete',
        'nom' => 'nomSociete',
        'idAdresse' => 'idAdresseSociete',
        'siteWeb' => 'siteWebSociete',
        'dateCreation'=> 'dateCreationSociete'));
 
    $rsm->addJoinedEntityFromClassMetadata('IcmeGrcBundle:Contact', 'c', 'p', 'contact', array(
        'id' => 'idPersonneContact',
        'actif' => 'actifContact',
        'dateCreation'=> 'dateCreationContact'));
    $rsm->addJoinedEntityFromClassMetadata('IcmeGrcBundle:Compte', 'cpte', 's', 'compte', array(
        'id' => 'idSocieteCompte',
        'dateCreation'=> 'dateCreationCompte',
        'description' => 'descriptionCompte',
        'dateConsultation' => 'dateConsultationCompte',
        'actif' => 'actifCompte',
        'siteWeb' => 'siteWebCompte',
        'idProfil' => 'idProfilCompte'));
 
 
    $sql = "SELECT contact.dateConsultation AS dateObjet, personne.id, personne.nom
            FROM personne, contact
            WHERE personne.id = contact.idPersonne
            UNION
            SELECT compte.dateConsultation AS dateObjet, societe.id, societe.nom
            FROM societe, compte
            WHERE compte.idSociete = societe.id
            ORDER BY dateObjet DESC
            LIMIT 10
            ";
    $query = $em->createNativeQuery($sql, $rsm);
 
    return $query->getResult();
}
Et mon action pour afficher ces éléments récents :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
public function afficherAction ()
    {
        $em = $this->getDoctrine()->getEntityManager();
 
        $elementsRecents = $em->getRepository('IcmeMainBundle:Personne')->getElementsRecents();
 
        return $this->render('IcmeMainBundle:ElementsRecents:afficher.html.twig', array('elementsRecents' => $elementsRecents));
    }
Mon souci est que, lorsque je me situe sur la page d'affichage de tous mes contacts, j'ai mes deux requêtes qui entrent en "conflit". Ici étant donné que je n'affiche que le nom pour les éléments récents, j'ai uniquement le nom de mes contacts qui apparait dans ma page d'affichage des contacts.

En effet, la requête est basée sur mon entité Personne, et je pense que le souci vient de là, mais je ne vois pas comment effectuer deux requêtes séparées.

Autre question, je ne sais pas où placer ma requête pour les éléments récents, car le PersonneRepository n'est pas vraiment fait pour cette requête puisque je sélectionne les comptes également et par la suite d'autres objets.

Voici ma requête SQL pour sélectionner tous ces objets :
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
22
23
24
25
26
27
28
29
30
31
32
33
 
SELECT compte.dateConsultation AS dateObjet, societe.nom
FROM compte, societe
WHERE compte.idSociete = societe.id
*
UNION
*
SELECT opportunite.dateConsultation as dateObjet, opportunite.nom
FROM opportunite
*
UNION
*
SELECT contact.dateConsultation as dateObjet, CONCAT(CONCAT(personne.nom, " "),personne.prenom)
FROM contact, personne
WHERE contact.idPersonne = personne.id
*
UNION
*
SELECT piste.dateConsultation as dateObjet, CONCAT(CONCAT(personne.nom, " "),personne.prenom)
FROM piste, personne
WHERE piste.idPersonne = personne.id
*
UNION
*
SELECT tache.dateConsultation as dateObjet, tache.objet
FROM tache
*
UNION
*
SELECT evenement.dateConsultation as dateObjet, evenement.objet
FROM evenement
*
ORDER BY dateObjet DESC
Ma question est : Comment puis-je fais un OrderBy sur l'ensemble de mes dateConsultation. Il me semble qu'avec Doctrine 2 c'est impossible, si je ne me trompe pas, puisqu'il faut utiliser un UNION...

Si quelqu'un pouvait m'éclairer...

Merci d'avance,

Cordialement.