2009-10-27 10 views
12

Ich brauche etwas wie folgt aus:Iterate Lehre Sammlung von einigen Feld bestellt

 $products = Products::getTable()->find(274); 
     foreach ($products->Categories->orderBy('title') as $category) 
     { 
      echo "{$category->title}<br />"; 
     } 

ich weiß, ist es nicht möglich, aber ... Wie kann ich etwas tun, ohne eine Doctrine_Query zu schaffen?

Danke.

Antwort

9

Ich schaute nur auf das gleiche Problem. Sie müssen die Doctrine_Collection in ein Array konvertieren:

$someDbObject = Doctrine_Query::create()...; 
$children = $someDbObject->Children; 
$children = $children->getData(); // convert from Doctrine_Collection to array 

Dann können Sie eine benutzerdefinierte Sortierfunktion erstellen und rufen:

// sort children 
usort($children, array(__CLASS__, 'compareChildren')); // fixed __CLASS__ 

Wo compareChildren etwas wie folgt aussieht:

private static function compareChildren($a, $b) { 
    // in this case "label" is the name of the database column 
    return strcmp($a->label, $b->label); 
} 
+2

Ihre Lösung nur funktioniert, wenn ich es geändert: usort ($ Kinder, array (_____ CLASS_____, 'compareChildren')); – stoefln

31

Sie kann auch tun:

$this->hasMany('Category as Categories', array(... 
      'orderBy' => 'title ASC')); 

In Ihrer Schemadatei sieht es so aus:

Relations: 
    Categories: 
     class: Category 
     .... 
     orderBy: title ASC 
+5

Wenn die Sortierung "permanent" ist, ist die Verwendung dieser Methode weitaus besser als die von Chris William. – avetisk

+2

Der Nachteil ist die Permanenz. Das Hinzufügen einer Bestellung zu jeder Abfrage für diese Beziehung wirkt sich auf die Leistung aus. –

+0

oder durch '@ OrderBy' Annotation: http://docs.doctrine-project.org/en/2.0.x/reference/annotations-reference.html#annref-orderby – zizoujab

3

Sie können eine Sortierfunktion Colletion.php hinzufügen:

public function sortBy($sortFunction) 
{ 
    usort($this->data, $sortFunction); 
} 

von ihrem Alter eine Doctrine_Collection der Nutzer Sorting würde wie folgt aussehen:

class ExampleClass 
{ 

    public static function sortByAge($a , $b) 
    { 
     $age_a = $a->age; 
     $age_b = $b->age; 

     return $age_a == $age_b ? 0 : $age_a > $age_b ? 1 : - 1; 
    }  

    public function sortExample() 
    { 
     $users = User::getTable()->findAll(); 
     $users ->sortBy('ExampleClass::sortByAge'); 

     echo "Oldest User:"; 
     var_dump ($users->end()); 
    } 

} 
9

Sie könnten Sammlung Iterator verwenden:

$collection = Table::getInstance()->findAll(); 

$iter = $collection->getIterator(); 
$iter->uasort(function($a, $b) { 
    $name_a = (int)$a->getName(); 
    $name_b = (int)$b->getName(); 

    return $name_a == $name_b ? 0 : $name_a > $name_b ? 1 : - 1; 
});   

foreach ($iter as $element) { 
    // ... Now you could iterate sorted collection 
} 

Wenn Sie Sammlung mit __toString Methode sortieren wollen, wird es viel einfacher sein:

foreach ($collection->getIterator()->asort() as $element) { /* ... */ } 
+1

Versuchte mit '$ collection-> getIterator() -> asort()' aber es gibt einfach bool zurück. –

+0

Sorry, ich habe vergessen, wie es funktioniert. Du hast recht, es ist wahr beim Erfolg und falsch beim Scheitern. So ein schönes Design. – temochka

+0

Wahrscheinlichkeiten sind, wenn Sie asort vor der Iteration aufrufen, können Sie durch die sortierte Liste iterieren. –

Verwandte Themen