দ্বন্দ্ব যেখানে দ্ব্যর্থক কলাম নাম সহ ধারা


28

এর জন্য কিছুটা প্রসঙ্গ। আমি আরও কলাম পেতে বিক্রয় ক্রম রফতানি কার্য (গ্রিডের মাধ্যমে) প্রসারিত করতে চাই। আমি একটি মডিউল তৈরি করেছি যা রফতানির জন্য একটি নতুন গ্রিড যুক্ত করে এবং একটি নতুন সংগ্রহের মডেল যা মূলটিকে প্রসারিত করে। এটি _বিফরডলোড () ফাংশনটি ব্যবহার করে যাতে আমি আমার প্রয়োজনীয় টেবিলগুলিতে যোগ দিতে পারি।

আমার যে সমস্যা হচ্ছে তা হ'ল যখন গ্রিড থেকে ফিল্টারগুলি যুক্ত করা হয় (ইনক্রিমেন্ট_আইডি, অর্ডার তারিখ ইত্যাদি), যেখানে এই ধারাটি যুক্ত করা হয় তা সারণির উপরিবর্তন করে না এবং আমি অস্পষ্ট কলামের নাম নিয়ে সমস্যা পাচ্ছি। উদাহরণস্বরূপ, ইনক্রিমেন্ট_আইডিতে আমি যেখানে সমস্যাটিতে সমস্যাটি করছি:

SELECT `main_table`.*, `sales`.`total_qty_ordered`, `sales`.`entity_id` AS `order_id`, `sagepay`.`vendor_tx_code` FROM `sales_flat_order_grid` AS `main_table`
 LEFT JOIN `sales_flat_order` AS `sales` ON main_table.increment_id = sales.increment_id
 LEFT JOIN `sagepaysuite_transaction` AS `sagepay` ON order_id = sagepay.order_id WHERE (increment_id LIKE '%100000261%') GROUP BY `main_table`.`entity_id`

এই যেখানে ক্লজটি যুক্ত করার আগে আমি _ডডকলম ফিল্টারটোকলকশন () ফাংশনে অন্যান্য টেবিলগুলিতে যোগদানের আগে যুক্ত করা হবে

protected function _addColumnFilterToCollection($column)
    {
        if ($this->getCollection()) {
            $field = ( $column->getFilterIndex() ) ? $column->getFilterIndex() : $column->getIndex();
            if ($column->getFilterConditionCallback()) {
                call_user_func($column->getFilterConditionCallback(), $this->getCollection(), $column);
            } else {
                $cond = $column->getFilter()->getCondition();
                if ($field && isset($cond)) {
                    // Filter added at this point
                    $this->getCollection()->addFieldToFilter($field , $cond);
                }
            }
        }
        return $this;
    }

একটি সংক্ষিপ্ত পরীক্ষা হিসাবে, আমি লাইনটি এতে পরিবর্তন করেছি

$this->getCollection()->addFieldToFilter('main_table.' . $field , $cond);

এবং এটি কাজ করেছে তবে এটি করার দুর্দান্ত উপায় অনুভব করে না।

_পরেলডে আমার কোডটি ()

protected function _beforeLoad()
{
    // Join the sales_flat_order table to get order_id and and total_qty_ordered
    $this->getSelect()->joinLeft(array('sales' => $this->getTable('sales/order')),
        'main_table.increment_id = sales.increment_id',
        array('total_qty_ordered' => 'sales.total_qty_ordered',
              'order_id' => 'sales.entity_id'));

    // Join the SagePay transaction table to get vendor_tx_code
    $this->getSelect()->joinLeft(array('sagepay' => $this->getTable('sagepaysuite2/sagepaysuite_transaction')),
        'order_id = sagepay.order_id',
        array('vendor_tx_code' => 'vendor_tx_code'));

    $this->getSelect()->group('main_table.entity_id');
    parent::_beforeLoad();
}

বিক্রয় অর্ডারের গ্রিড টেবিল এবং সেজপেই লেনদেনের টেবিলটিতে যোগদানের জন্য আমাকে ইনক্রিমেন্ট_আইডি ব্যবহার করতে হবে কারণ আমি দেখতে পাচ্ছি এটিই কেবলমাত্র সাধারণ আইডি।

মূলত আমি ভাবছি যে এটিকে মোকাবেলা করার জন্য সর্বোত্তম পন্থাটি কী। আমি উপরে উল্লিখিত পরিবর্তনটি করে সম্ভবত পালাতে পারলাম তবে এটি সঠিক মনে হচ্ছে না। আমার যোগদানের বিবৃতিগুলিতে আমি কী পরিবর্তন করতে পারি?

ধন্যবাদ।


1
আপনি টেবিলগুলিতে কীভাবে যোগদান করেছেন? জেনড_ডিবি_স্লেট মডেলটিতে কাজ করা একটি খারাপ ধারণা, কারণ ম্যাজেন্টো যৌথ টেবিলগুলি রেকর্ড করে এবং সাধারণত সমস্ত উপসর্গ যুক্ত করে। আমি যোগ দেওয়ার বিষয়ে একটি ব্লগ নিবন্ধ লিখেছিলাম, সম্ভবত এটি সহায়তা করে: blog.fabian-blechschmidt.de/articles/…
ফ্যাবিয়ান

প্রতিক্রিয়া জন্য আপনাকে ধন্যবাদ, আমি এটি একটি পড়তে হবে। আমি joinTable () ব্যবহার করার চেষ্টা করেছি কিন্তু এটি সংগ্রহের মডেলটিতে পাওয়া যায় নি।
পল

উত্তর:


52

নিম্নলিখিত সংগ্রহের পদ্ধতিটি ব্যবহার করে আপনি যে কোনও অস্পষ্টতাকে সহজেই সমাধান করতে পারেন:

  • addFilterToMap($filterName, $alias, $group = 'fields')
    • $filter- এটি addFieldToFilter()পদ্ধতিতে ব্যবহৃত হয় এমন ফিল্টারটির নাম এটি আপনার ক্ষেত্রে এটিincrement_id
    • $alias- এটি ফিল্টারটির সাথে সম্পর্কিত কলামের পুরো নাম, আপনার ক্ষেত্রে এটি ঘটেছে main_table.increment_id
    • $group - সংগ্রহের কোনও ধরণের তথ্যের মানচিত্র হওয়ার উদ্দেশ্যে তৈরি হয়েছিল, তবে আপাতত এটি কেবল ফিল্টারগুলিতে ব্যবহৃত হয়, তাই আপনি এই যুক্তিটি বাদ দিতে পারেন।

এছাড়াও আমি মনে করি না যে লোডের আগে আপনার যোগদানের সঠিক জায়গাটি যদি আপনি কোনও ইভেন্ট পর্যবেক্ষণ না করেন তবে। আপনার ক্ষেত্রে _initSelect()আগে কল করার সাথে এটি পদ্ধতিতে সরিয়ে নেওয়া ভাল parent::_initSelect()। সংযুক্ত বিরোধগুলি সমাধানের জন্য আপনি আপনার addFilterToMap()পদ্ধতির অভ্যন্তরে পদ্ধতিটি কল করতে পারেন _initSelect():

$this->addFilterToMap('increment_id', 'main_table.increment_id');

আগ্রহের বাইরে, _ইনিটসিলিট () এ যোগদান করা ভাল কেন?
পল

@ পলকে _initSelectসর্বদা একবার মৃত্যুদন্ড কার্যকর করা হয়, একসময় আরও একবার _beforeLoadবলা যেতে পারে, কারণ আপনি load()যদি তার স্থিতি পুনরায় সেট করেন তবে আপনি একাধিকবার সংগ্রহ করতে পারেন ।
ইভান চেপর্ণি

@ পলও পাশাপাশি, যেহেতু _ফরফআল্ডটি দু'বার কল করা যায়, তাই আপনি দ্বিতীয় কলটিতে জেন্ড_ডিব_সিলেক্ট থেকে মারাত্মক ত্রুটি পাবেন।
ইভান চেপর্ণি

2
আমি এরকম $collection = Mage::getModel("education/ticket") ->getCollection() ->addFilterToMap('updated_at', 'main_table.updated_at') ->addFilterToMap('created_at', 'main_table.created_at');
করণীয় করেছি

পছন্দ করুন এটি প্রতিফলিত করে যে আপনি ম্যাজেন্টো 1 স্থপতি হিসাবে অসাধারণ
অমিত বেরা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.