Voila, j'ai besoin de récuperer une collection d'enregistrement d'une table à partir d'un enregistrement d'une table parente. Ma collection devant être filtrés par une date max.
Voici mon schéma:
donc a partir d'un enregistrement dans groupasset je veux récupérer tout les enregistrements liés de la table asset qui ont la date lastview la plus haute.
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 groupasset: actAs: Timestampable: Sluggable: fields: [name, site] unique: true canUpdate: true columns: name: string(255) site_id: integer user_id: integer status: string(2) person: string(2) lastview: date indexes: Unique1: fields: [name, site_id] type: unique relations: owner: class: sfGuardUser local: user_id foreign: id foreignAlias: groupassets onDelete: SET NULL site: class: Site local: site_id foreign: id onDelete: SET NULL Typeasset: tableName: typeasset columns: name: string(255) Asset: tableName: asset actAs: [Timestampable] columns: typeasset_id: integer value: string(255) groupasset_id: integer etat: string(50) action: string(50) lastview: date indexes: unique1: fields: [typeasset_id,value,groupasset_id] type: unique lastview: fields: lastview: sorting: DESC relations: type: class: Typeasset local: typeasset_id foreign: id foreignAlias: listTypeAsset onDelete: CASCADE group: class: groupasset local: groupasset_id foreign: id foreignAlias: listGroupAsset
si je met la date en dur comme ci-dessus j'ai un temps d'affichage de 1498ms, tout a fait correcte.
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 public function getListActiveGroupAsset() { if ($this->getListGroupAsset()->count()==0) return null; $list = $this->getListGroupAsset(); $lastView = "2010-11-01"; foreach($this->getListGroupAsset() as $asset) { if( $asset->getLastview()==$lastView){ $list[]=$asset; } } return $list; }
Mais si je vais chercher cette date:
avec la function getLastDate():
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 public function getListActiveGroupAsset() { if ($this->getListGroupAsset()->count()==0) return null; $list = $this->getListGroupAsset(); $lastView=Doctrine_Core::getTable('Asset')->getLastDate(); foreach($this->getListGroupAsset() as $asset) { if( $asset->getLastview()==$lastView){ $list[]=$asset; } } return $list; }
je passe à un temps d'affichage de 44262 ms !!!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public function getLastDate(){ $q = $this->createQuery('a') ->select('DISTINCT a.lastview ') ->orderBy('a.lastview DESC') ->fetchOne(); $lastView = $q->getLastview(); return $lastView; }
je ne m'explique pas ce temps ahurissant et comment résoudre ça ?
Partager