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:
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
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
 
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;
	}
si je met la date en dur comme ci-dessus j'ai un temps d'affichage de 1498ms, tout a fait correcte.
Mais si je vais chercher cette date:
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;
	}
avec la function getLastDate():
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 passe à un temps d'affichage de 44262 ms !!!!
je ne m'explique pas ce temps ahurissant et comment résoudre ça ?