Bonjour,

Je pense que vous avez tous travaillé un jour avec des tables versionnées.
Par exemple, on a plusieurs version d'un objet, et l'on affiche toujours la dernière version.

En général, cet objet a le format suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
Objet 1:
  id
  valeur
  version
Si maintenant on a une table 2 qui a une relation OneToMany sur cette table 1. On a objet2->getObjets1() qui nous donne la liste de toutes les versions.

Une facon de récupérer le dernier élement est de faire comme suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
class Student
{
    // ...
 
    /**
     * @OneToMany(targetEntity="Transfer" mappedBy="student")
     * @OrderBy({"date" = "ASC"})
     */
    private $transfers;
 
    // ...
 
}
puis :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$student -> getTransfers() -> last();
La ou ca pose un problème, c'est si on a 2 millions de version de cet élément... on va devoir les charger toutes en mémoire pour récupérer uniquement le dernier.

Ma question :
Est-il possible de ne charger qu'un seul élément, mais de quand même garder le lien avec l'entité.
Par exemple :
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
 
class Student
{
    // ...
 
    /**
     * @OneToMany(targetEntity="Transfer" mappedBy="student")
     * @OrderBy({"date" = "ASC"})
     * @Limit(1)
     */
    private $transfer;
 
    // ...
 
}
puis un simple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
$student -> getTransfer()
Ca nous aiderait vraiment a limiter les sous requêtes et la duplication de code un peu partout pour bien spécifier qu'on veut le dernier élément, ainsi qu'une utilisation mémoire bien plus maitrisée.

Avez-vous une idée de la faisabilité de ce système ?
Merci,
Pierre