Comment sélectionner des champs avec des alias à l'aide de joinTable ou joinField dans Magento
Je veux pré-filtre* les données de la facture de la grille visible dans Magento panneau d'admin.
Ici est une question que j'ai posée tout à l'heure, et celui-ci est lié à la solution présentée pour que, par conséquent, il pourrait agir comme une bonne explication.
Donc, je suis à la modification de la Mage_Adminhtml_Block_Sales_Invoice_grid::_prepareCollection méthode de telle sorte qu'il récupère à la clientèle visée par l'utilisateur connecté en admin. Puis il va chercher les commandes à partir de ces client(s) - idéalement, uniquement l'id de la commande, Alors rejoignez cette collection de ventes/order_invoice_grid, pour obtenir les factures de cette administration.
Basé sur la dernière réponse et de l'aide ces docs, à la suite de 3 manières différentes, j'ai essayé de rejoindre cette information: (Exemple de Code 1)
$collection = Mage::getResourceModel('customer/customer_collection');
$collection->joinTable('sales/order_grid', 'customer_id=entity_id', array('*'));
$collection->joinTable('sales/invoice_grid', 'order_id=main_table.entity_id', array('*'));
Quand je le fais ci-dessus, je vois le message d'erreur suivant:
A joint field with this alias (0) is already declared.
#0 /var/www/magento/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php(706): Mage::exception('Mage_Eav', 'A joint field w...')
#1 /var/www/magento/app/code/local/Myproject/Adminhtml/Block/Sales/Invoice/Grid.php(41): Mage_Eav_Model_Entity_Collection_Abstract->joinTable('sales/invoice_g...', 'order_id=main_t...', Array)
#2 /var/www/magento/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(576): Myproject_Adminhtml_Block_Sales_Invoice_Grid->_prepareCollection()
#3 /var/www/magento/app/code/core/Mage/Adminhtml/Block/Widget/Grid.php(582): Mage_Adminhtml_Block_Widget_Grid->_prepareGrid()
Si je supprime le deuxième appel à joinTable, le code ci-dessus fonctionne, mais ce n'est pas ce que je veux.
L'autre méthode que j'ai essayé avec ce code:
$collection = Mage::getResourceModel('customer/customer_collection');
$collection->joinTable('sales/order_grid', 'customer_id=entity_id', array('entity_id as order_entity_id'));
$collection->joinTable('sales/invoice_grid', 'order_id=main_table.entity_id', array('*'));
Voici le message d'erreur s'affiche sur la deuxième ligne, là où je suis en train d'essayer de faire un alias de l'ordre des champs.entity_id de sorte qu'il n'entre pas en conflit avec la facture tables entity_id. Cependant, qui produit un message d'erreur tel que:
Élément (Mage_Customer_Model_Customer)
avec le même id "1" existent déjà
J'ai seulement besoin de numéro de commande afin que je puisse obtenir les factures, ce qui suggère que je peux aussi utiliser joinField fonction, j'ai essayé comme suit:
$collection = Mage::getResourceModel('customer/customer_collection');
$collection->joinField('order_entity_id', 'sales/order_grid', 'entity_id', 'customer_id=entity_id' , null, 'left');
Mais il me donne l'erreur suivante:
Élément (Mage_Customer_Model_Customer) avec le même id "1" existent déjà
Je suis à la recherche d'une solution qui rejoint client->factures.
Par pré-filtre, je veux dire que les données figurant dans la grille est filtré avant même tout ce qui est présenté dans la grille.
Ok, maintenant, mon code ressemble à ceci:
$collection =
Mage::getResourceModel('customer/customer_collection');
$collection->joinTable('sales/order_grid', 'customer_id=entity_id', array('entity_id' => 'order_entity_id'));
Et le message d'erreur que je reçois est:
SELECT `e`.*, `sales_flat_order_grid`.`order_entity_id` AS `entity_id` FROM `customer_entity` AS `e`
INNER JOIN `sales_flat_order_grid` ON (sales_flat_order_grid.customer_id=e.entity_id) WHERE (e.entity_type_id = '1') ORDER BY `e`.`created_at` desc, `e`.`created_at` desc LIMIT 20
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'sales_flat_order_grid.order_entity_id' in 'field list'
OriginalL'auteur Ozair Kafray | 2010-10-16
Vous devez vous connecter pour publier un commentaire.
Ici, c'est le total de mon script de test. À utiliser dans un fichier placé à la racine de Magento et tapez l'URL directement dans votre navigateur, il n'est pas géré par Magento contrôleurs. C'est un bon moyen d'expérimenter comme il n'est pas influencé par d'autres modules, mises en page, etc.
Comme avec votre précédente question, j'ai choisir de réinitialiser l'initiale de colonnes car je ne crois pas en donnant de la base de données de plus de travail que nécessaire. Cependant, il n'est pas essentiel, le test réussit sans elle.
Si cela ne fonctionne pas dans votre installation, nous avons besoin de réfléchir à ce que l'extérieur de l'influence pourrait être.
OriginalL'auteur clockworkgeek
L'erreur "conjointe avec cet alias (0) est déjà déclaré." se produit parce qu'il utilise des clés du tableau en tant qu'alias. Puisque vous avez deux
joinTable()
appels, avec un tableau, c'est d'essayer d'utiliser l'index de base zéro de la fois et, évidemment, dans une situation de conflit.Ainsi, au lieu de
essayer
pour éviter le conflit.
Oups, j'ai reçu la clé et la valeur dans le mauvais sens. J'aurais dit
array('order_entity_id' => 'entity_id')
J'ai déjà essayé de cette façon, et l'erreur est: "le Point Mage_Customer_Model_Customer) avec le même id "1" existent déjà #0 /var/www/magento/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php(236): Varien_Data_Collection->addItem(Objet(Mage_Customer_Model_Customer)) #1 /var/www/magento/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php(963): Mage_Eav_Model_Entity_Collection_abstract->addItem(Objet(Mage_Customer_Model_Customer))"
Quand je fais un test je n'ai pas d'erreur comme ça. En fait, je ne trouve pas cette erreur "Abstract.php(236)" ou dans tout autre fichier dans Magento. Êtes-vous à l'aide d'une très vieille version ou avez-vous des extensions qui modifie le noyau de la VAE?
Oui, je suis en utilisant une extension Sweettooth, et tout sa il y a l'erreur mentionne une classe à partir de ce module (TBT_Rewards_Model_Customer) avoir le problème, mais je l'avais désinstallé, c'est pour voir si l'erreur disparaît. Malheureusement, ce n'est pas le cas, l'erreur s'affiche ensuite avec du Mage de classe de base.
OriginalL'auteur clockworkgeek
Je l'ai enfin fait parvenir en va de facture->ordre->client comme "Anda B' a suggéré. Je suis juste coller ma solution ici comme une référence, mais en utilisant cette solution de clockworkgeek, car il semble beaucoup plus propre. Et ma solution doit encore être fait plus propre grâce à l'obtention de la " id " de eav_attribute (agent_id) à partir de la base de données lors de l'exécution, au lieu de codage en dur, comme collés ici:
OriginalL'auteur Ozair Kafray
Il vous donne cette erreur "le Point Mage_Customer_Model_Customer) avec le même id "1" existe déjà", car un client peut avoir plusieurs ordres et peuvent donc avoir deux ou plus de deux entrées avec le même id de client - vous êtes à la création d'une collection de clients et vous devez avoir unique entrées dans la collection.
Vous devez commencer à partir de factures et de les associer avec les clients.
C'est parce que Mage_Sales_Model_Mysql4_Order_Grid_collection hérite de Mage_Core_Model_Mysql4_Collection_abstract, il n'utilise pas le modèle eav; vous devez utiliser join($table, $dir, $cols='*'). Le client collection hérite de Mage_Eav_Model_Entity_Collection_abstract et que vous utilisez joinTable
OriginalL'auteur Anda B
La façon la plus simple que j'ai trouvé de l'magento forum ,
Dans le
Nous pouvons utiliser des requêtes comme
et il fonctionne
OriginalL'auteur epynic