2011-10-17 2 views
0

J'ai cette requête:collection de requêtes SQL dans Magento

 $collection = $this->getAssociatedProductCollection($product) 
      ->addAttributeToSelect('*') 
      ->addFilterByRequiredOptions() 
      ->setPositionOrder() 
      ->addStoreFilter($this->getStoreFilter($product)) 
      ->addAttributeToFilter('status', array('in' => $this->getStatusFilters($product))) 
->addAttributeToSort('my_attribute', 'DESC'); 

et je veux commander les produits associés par « my_attribute »

L'extrait ->addAttributeToSort('my_attribute', 'DESC'); ne me donne pas le bon résultat parce que j'ai numéros stockés en tant que texte dans mon attribut.

J'ai fais une base de données de test et je l'ai vu que la requête en cours faire le bon ordre dans ma base de données de test:

SELECT * FROM length ORDER BY my_attribute + 0 

Ma question est la suivante: comment ajouter le « + 0 » dans ma première requête Magento de faire le bon ordre par :)

[EDIT]

Voici ma fonction modifiée complète:

public function getAssociatedProducts($product = null) 
{ 
    if (!$this->getProduct($product)->hasData($this->_keyAssociatedProducts)) { 
     $associatedProducts = array(); 

     if (!Mage::app()->getStore()->isAdmin()) { 
      $this->setSaleableStatus($product); 
     } 


     $collection = $this->getAssociatedProductCollection($product) 
      ->addAttributeToSelect('*') 
      ->addFilterByRequiredOptions() 
      ->setPositionOrder() 
      ->addStoreFilter($this->getStoreFilter($product)) 
      ->addAttributeToFilter('status', array('in' => $this->getStatusFilters($product))) 
      ->addAttributeToSort('breite', 'ASC') 
      // My Modification 
      ->addAttributeToSort('my_attribute', 'ASC'); 
      // My Modification 


     foreach ($collection as $item) { 
      $associatedProducts[] = $item; 
     } 

     $this->getProduct($product)->setData($this->_keyAssociatedProducts, $associatedProducts); 
    } 
    return $this->getProduct($product)->getData($this->_keyAssociatedProducts); 
} 

[/ EDIT]

Merci beaucoup. :)

+0

Essayez de trier en utilisant 2 attributs? Je vois que vous appelez addAttributeToSort deux fois –

Répondre

1

Il n'y a pas moyen facile de le faire, je vous recommande de vérifier exactement ce que votre collection fait par:

vardump((string)$collection->getSelect()); 

qui devrait renvoyer la requête utilisée pour récupérer cette collection, vous pourrait être capable d'utiliser directement SQL à la place sur votre code.

Autre option serait de trier la collection en utilisant les fonctions de tri tableau PHP comme:

$data = $collection->getItems(); //an array of objects- 
usort($data,array('my_attribute','sortByMyAttribute')); 
return $data; 

function sortByMyAttribute(){ 
    # 
    # Do your desired sort here 
} 

Ok après avoir vu le essai de code de mise à jour:

$collection = $this->getAssociatedProductCollection($product) 
     ->addAttributeToSelect('*') 
     ->addFilterByRequiredOptions() 
     ->addStoreFilter($this->getStoreFilter($product)) 
     ->addAttributeToFilter('status', array('in' => $this->getStatusFilters($product))) 
     ->addAttributeToSort('breite', 'ASC') 

J'ai retiré l'ensemble positionOrder , laissez-moi savoir comment ça se passe

+0

Je cherche exactement la syntaxe à faire: "# Faites votre tri désiré ici" :) Merci. – Bizboss

+0

Si votre attribut est numérique, vous pouvez peut-être essayer d'utiliser l'option "asort" au lieu de "usort", et si la réponse vous a été utile, les upvotes sont les bienvenues: P –

+0

Hi Bizboss, Toujours coincé avec le sort? Faites-moi savoir si vous avez besoin de plus d'aide –