অ্যান্টি-জয়েন (ম্যাজেন্টো 1.9) ব্যবহার করে আমি এটি করার কিছুটা ভাল উপায় খুঁজে পেয়েছি।
এই পদ্ধতির সুবিধা
মূল উত্তরের মাধ্যমে এটির সুবিধা হ'ল আপনি মিথ্যা ধনাত্মকতা পাবেন না এবং ফলশ্রুতিতে এটি দ্রুত এবং কম ত্রুটি-প্রবণ। উদাহরণস্বরূপ, ধরুন আপনার একক পণ্য রয়েছে:
- শার্ট (বিভাগগুলিতে: 1 | 2)
আপনি "সমস্ত পণ্য অন্তর্ভুক্ত নয় তা খুঁজে পেতেcategory 3
category 3
চান , তারপরে সেগুলিতে যুক্ত করুন " । সুতরাং আপনি একটি NOT IN
ক্যোয়ারী চালান , এবং এটি দুটি সারি ফিরে আসবে (name | category_id)
:
1. "Shirt" | 1
2. "Shirt" | 2
কোনও বড় কথা নয়, ম্যাজেন্টো এখনও কেবল প্রথম ফলাফলটি ফিরিয়ে দেবে এবং তারপরে আপনি এটি যুক্ত করুন। বাদে ! দ্বিতীয়বার এই ক্যোয়ারীটি চালিত হওয়ার পরে, আপনার একই ফলাফল রয়েছে:
1. "Shirt" | 1
2. "Shirt" | 2
এবং ম্যাজেন্টো আপনাকে বলবে যে আপনি এখনও এই শার্টটি যোগ করেন নি category 3
। এটি কারণ যখন কোনও পণ্য একাধিক বিভাগের অন্তর্ভুক্ত থাকে, তখন তাদের "ক্যাটালগ_প্রডাক্ট_েন্টিটি" সারণীতে একাধিক সারি থাকবে । এবং তাই একটি LEFT JOIN
একাধিক ফলাফল প্রদান করবে।
এটি অনাকাঙ্ক্ষিত কারণ
- আপনার ফলাফল সেটটি প্রয়োজনের চেয়ে বড় হবে, যা প্রয়োজনের চেয়ে বেশি মেমরি ব্যবহার করবে। বিশেষত তাই আপনার যদি হাজার হাজার আইটেমের খুব বড় জায় থাকে।
- ফলাফলগুলি মিথ্যা পজিটিভ (উদাহরণস্বরূপ
in_array($categoryThree, $product->getCategories())
) কিনা তা নির্ধারণ করার জন্য আপনাকে পিএইচপি-তে একটি অতিরিক্ত চেক করতে হবে, যার অর্থ আপনি অপ্রয়োজনীয় ফলাফলের মধ্য দিয়ে লুপ করবেন। এটি আপনার স্ক্রিপ্ট / কোডকে ধীর করে দেবে, বিশেষত বৃহত ইনভেন্টরিজ সহ।
সমাধান
// All products not in this category ID
$notInThisCatId = '123';
$filteredProducts = Mage::getModel('catalog/product')->getCollection();
$filteredProducts
->joinField('category_id', 'catalog_category_product', 'category_id', 'product_id=entity_id', ['category_id'=>$notInThisCatId], 'left');
$filteredProducts
->addAttributeToFilter('category_id', [
['null' => true]
]);
উত্পাদিত এসকিউএল কোয়েরিটি দেখতে পাবেন:
SELECT
DISTINCT `e`.*, `at_category_id`.`category_id`
FROM `catalog_product_entity` AS `e`
LEFT JOIN `catalog_category_product` AS `at_category_id`
ON (at_category_id.`product_id`=e.entity_id) AND (at_category_id.category_id = '123')
WHERE (at_category_id.category_id IS NULL)
GROUP BY `e`.`entity_id`;
ব্যাখ্যা:
পণ্য এবং পণ্য দেওয়া হয়েছে <=> বিভাগ সম্পর্ক সারণী:
catalog_product_entity
+-----------+
| ENTITY_ID |
+-----------+
| 423 |
| 424 |
| 425 |
+-----------+
catalog_category_product
+-------------+------------+
| CATEGORY_ID | PRODUCT_ID |
+-------------+------------+
| 3 | 423 |
| 123 | 424 |
| 3 | 425 |
+-------------+------------+
আপনার ক্যোয়ারীটি বলছে, "আমাকে " ক্যাটালগ_প্রডक्ट_এন্টিটি " এ সমস্ত সারি দিন এবং " ক্যাটালগ_ক্যাটরি_প্রোডাক্ট " থেকে " বিভাগ_আইডি " কলামে পেস্ট করুন Then তারপরে আমাকে কেবল বিভাগ_id = 124" সারি দিন । "
এটি একটি বাম যোগদানের কারণে এটিতে সর্বদা "ক্যাটালগ_প্রডक्ट_েন্টিটি" থেকে সারি থাকবে । যে কোনও সারি মিলে যায় না, এটি হ'ল NULL
:
ফলাফল
+-------------+-------------+
| ENTITY_ID | CATEGORY_ID |
+-------------+-------------+
| 423 | NULL |
| 424 | 123 |
| 425 | NULL |
+-------------+-------------+
সেখান থেকে কোয়েরিটি পরে বলে, "ঠিক আছে, এখন আমাকে যেখানে সমস্ত শ্রেণি_আইডিটি নুল" তা দিয়ে দিন ।