সংগ্রহের ক্যোয়ারিতে একটি টেবিলে বাম বাম


27

আমি রফতানির জন্য সিস্টেম থেকে কিছু আদেশ পেতে নিম্নলিখিতটি করছি:

$orders = Mage::getModel('sales/order')->getCollection()
    ->addFieldToFilter('status', $statusToExport)
    ->addFieldToFilter('store_id', $this->processingStoreId)
    ->addFieldToFilter('updated_at', array('gteq' => date('Y-m-d H:i:s', $lastSyncTime)));

আমার কাছে কাস্টম টেবিলের অর্ডার থাকলে সেটি যেখানে রফতানি হয় না সেখানে আমাকে এমন কিছু যুক্ত করতে হবে entity_id। আমি যদি এসকিউএল ব্যবহার করতাম তবে আমি করতাম:

left join myTable as mt on main_table.entity_id = mt.entity_id
where mt.entity_id is null

তবে আমি নিশ্চিত না যে কীভাবে কোনও অনুরূপ কাজ করতে সংগ্রহের ক্যোয়ারীটি পরিবর্তন করতে হবে।

দ্রষ্টব্য: আমি চেষ্টা করেছি

$orders = $orders->getSelect()
    ->joinLeft(
        array("t1" => $myTable),
        "main_table.entity_id = t1.entity_id",
        array("admin_field_id" => "t1.id")
    )
    ->where("t1.id is null")

তবে এটি এটি পরিবর্তন করে তাই এটি একটি কোয়েরি এবং আমি বিক্রয় / অর্ডার সংগ্রহ ফিরে পেতে চাই।

আমি অনুভব করছি যে আমি কিছু সাধারণ অনুপস্থিত ...

সম্পাদনা

ঠিক আছে, আমি এটি চেষ্টা করেছি:

$orders->getSelect()
    ->joinLeft(
        array("t1" => $myTable),
        "main_table.entity_id = t1.entity_id",
        array("admin_field_id" => "t1.id")
    )
    ->where("t1.id is null");

আমি যখন (string)$orders->getSelect()এটি প্রতিধ্বনিত করি তখন আমার যে ক্যোয়ারীটি প্রত্যাশিত তা ফেরত দেয় এবং আমি যখন এটি চালিত করি তখন কোনও ফল দেয় না। $ordersতবে, এখনও আইটেম রয়েছে। আমি ভেবেছিলাম এই যোগদানের অর্থ এই মুহুর্তে সংগ্রহটি সংশোধন করা হয়েছিল?

উত্তর:


53

ক্যোয়ারী পরিবর্তন করতে আপনি করতে পারেন

$collection->getSelect()->doWhateverYouWantWithSelectObject();
foreach($collection as $order) {} // order collection

তবে কোনও টেবিলে যোগ দিতে, আপনি কেবল এটি ব্যবহার করতে পারেন $collection->joinTable()

joinTableকেবলমাত্র ম্যাজ_ইভ_মোডেল_এন্টি_কোলকেশনে বিদ্যমান, এর অর্থ: পণ্য, বিভাগ, অর্ডার, চালান, ক্রেডিটমো, শিপিং, গ্রাহকগণ। (মন্তব্যের জন্য @ ফ্রাকে ধন্যবাদ)

joinTable ()

তবে ম্যাজেন্টো সংগ্রহগুলির একটি পদ্ধতি রয়েছে joinTable()এটি কীভাবে ব্যবহৃত হয় তা ফিজ করতে আমার 45 মিনিট সময় নিয়েছিল। এটি আপনার পক্ষে এড়াতে, আমি এটি ভাগ করে নিই।

$productCollection->joinTable(
    array('bonus' => 'mycompany/bonus'), 'product_id=entity_id',
    array('bonus_id' => 'bonus_id')
);

পরামিতিগুলি হ'ল:

public function joinTable($table, $bind, $fields = null, $cond = null, $joinType = 'inner')
  1. টেবিলটি সহজ, এটি ম্যাজেন্টো namespace/entityফর্ম্যাট, যা আপনি আপনার কনফিগারেশন, সংস্থানসমূহের মডেল এবং সংগ্রহে ব্যবহার করেন। আপনি বিন্যাসের একটি অ্যারে ব্যবহার করতে পারেনarray('alias' => 'namespace/entity')
  2. বাঁধার অর্থ, আপনার এসকিউএল-এ অন বিবৃতি। এটি সবচেয়ে কঠিন অংশ ছিল এবং আমি পরে এটি বিশদে ব্যাখ্যা করব। সমতল চিহ্নের পরে আপনার ফ্ল্যাট টেবিল এবং আপনার EAV টেবিলটি থাকা গুরুত্বপূর্ণ important main_table.বৈশিষ্ট্যের আগে ব্যবহার করবেন না । ম্যাজেন্টো আপনার জন্য এটি করবে। এই সম্পর্কে আরও পরে।
  3. ক্ষেত্রগুলি একটি অ্যারে । আপনি যদি এর পরিবর্তে একটি স্ট্রিং ব্যবহার করেন, তাহলে আপনি এই পাবেন: Warning: Invalid argument supplied for foreach() in /var/www/magento-1.6.2.0/app/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php on line 775। আপনি বিন্যাসের একটি অ্যারে array('field1', 'field2', '...')বা ব্যবহার করতে পারেনarray('alias' => 'field1', '...')
  4. শর্তটি একটি ** কোথায় এসকিউএল-তে শর্ত *
  5. joinType। আমি আশা করি আপনি এটি জানেন কি। তবে আপনার কেবল বাম এবং INNER এর মধ্যে পছন্দ রয়েছেapp/code/core/Mage/Eav/Model/Entity/Collection/Abstract.php:793

এই বিষয়ে আরও


1
মহান তথ্য জন্য ধন্যবাদ। আপনার প্রথম পয়েন্টের ভিত্তিতে, $orders->getSelect() ->joinLeft(array("t1" => $myTable), "main_table.entity_id = t1.entity_id", array("admin_field_id" => "t1.id")) ->where("t1.id is null")আমার বর্তমান তালিকা থেকে আইটেমগুলি বাদ দেওয়া উচিত নয় ?
ওয়েবনুব

আমি মনে করি আপনি লোড করার পরে সংগ্রহটি সম্পাদনা করুন। মাত্র xdebug দিয়ে আপনার স্ক্রিপ্টটিতে andুকুন এবং মডেলের অভ্যন্তরে আইএসএলড পতাকাটি দেখুন
ফ্যাবিয়ান ব্ল্যাচসমিডট

2
যে joinTable পদ্ধতি উল্লেখ করতে মূল্য Mage_Eav_Model_Entity_Collection জন্য কেবল প্রাপ্তিসাধ্য
Fra

1

আমি এর কারণ খুঁজে পেয়েছি।

বাম জোড় প্রয়োগ করার আগে আমি যুক্ত করার আগে আমি মানগুলির একটি গণনা চেয়েছিলাম

$totalOrderCount = count($orders);

এর ফলে সংগ্রহটি লোড হয়ে যায় যার ফলস্বরূপ এটি বাম জোড়াকে অগ্রাহ্য করে যা আমি আরও করছিলাম। ডিবাগিংয়ের সময়, ভারের দিকে তাকানো _isCollectionLoadedফ্যাবিয়ার একটি ভাল পরামর্শ ছিল।

সংগ্রহের গণনা পাওয়ার পরিবর্তে আমি এখন এটি করছি:

$countOrdersObjs = clone $orders;
$totalOrderCount = count($countOrdersObjs);
unset($countOrdersObjs);

এটি আমাকে $ordersসংগ্রহ লোড না করে ফলাফল গণনা করতে দেয় ।

দ্রষ্টব্য: অনুগ্রহ করে উপরের ফ্যাবিয়ানদের পোস্টে কোনও পদক্ষেপ প্রয়োগ করুন কারণ তিনি আমাকে এ বিষয়ে গাইড করেছিলেন তবে আমি অনুভব করেছি যে সমাধানটি এর নিজের উত্তরটির নিশ্চয়তা দিয়েছে।

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