How to select specific fields with aliases using joinTable or joinField in Magento

前端 未结 3 1271
迷失自我
迷失自我 2021-02-15 06:29

I want to pre-filter* data in the invoice grid visible in Magento\'s admin panel.

Here is a question that I asked earlier, and this one is related to the solution prese

相关标签:
3条回答
  • 2021-02-15 06:51

    Here is the total of my test script. To use put it in a file at the Magento root and type it's URL directly in your browser, it is not handled by Magento's controllers. This is a good way of experimenting as it is not as influenced by other modules, page layouts, etc.

    <pre><?php
    
    require 'app/Mage.php';
    Mage::app();
    
    $collection = Mage::getResourceModel('customer/customer_collection');
    $collection->getSelect()->reset('columns');        
    $collection->joinTable('sales/order_grid', 'customer_id=entity_id', array('order_entity_id' => 'entity_id'));
    $collection->joinTable('sales/invoice_grid', 'order_id=order_entity_id', array('*'));
    
    foreach ($collection as $invoice)
        print_r($invoice->debug());
    
    ?></pre>
    

    As with your previous question I choose to reset the initial columns because I don't believe in giving the database more work than necessary. However it's not essential, the test still succeeds without it.

    If this doesn't work in your installation then we need to consider what that outside influence could be.

    0 讨论(0)
  • 2021-02-15 07:00

    The error "A joint field with this alias (0) is already declared." occurs because it uses array keys as aliases. Since you have two joinTable() calls, each with an array, it is trying to use the zero-based index of both and obviously having a conflict.
    So instead of

    array('entity_id as order_entity_id')
    

    try

    array('entity_id' => 'order_entity_id')
    

    to avoid the conflict.

    0 讨论(0)
  • 2021-02-15 07:00

    I finally did achieve this by going from invoice->order->customer as 'Anda B' suggested. I am just pasting my solution here as a reference, but will be using this solution from clockworkgeek, since it seems much cleaner. And my solution still needs to be made cleaner by getting the 'id' of eav_attribute (agent_id) from the database at runtime, instead of hard coding it, as pasted here:

    class Myproject_Adminhtml_Block_Sales_Invoice_Grid extends Mage_Adminhtml_Block_Sales_Invoice_Grid
    {
        const AGENT_ID_ATTRIBUTE_ID = 118;
    
        protected function _prepareCollection()
        {
    
    $collection = Mage::getResourceModel($this->_getCollectionClass());
    
            $collection->join('order_grid', 'order_id = order_grid.entity_id', array ('order_entity_id' => 'order_grid.entity_id'));
            $collection->getSelect()->join( 'customer_entity', 'customer_id = customer_entity.entity_id', array('customer_entity_id' => 'entity_id', 'email'));
            $collection->getSelect()->joinLeft( 'customer_entity_int', 'customer_entity_int.entity_id = customer_entity.entity_id AND attribute_id = ' . Myproject_Adminhtml_Block_Sales_Invoice_Grid::AGENT_ID_ATTRIBUTE_ID, 
                                            array('attribute_entity_id' => 'customer_entity_int.entity_id', 'attribute_id' , 'value'));
    
    //Apply Desired Data Filters here
    
    $this->setCollection($collection);
    
    return $collection;
    
    0 讨论(0)
提交回复
热议问题