วิธีเพิ่มคอลัมน์พร้อมตัวกรองใน Magento 2 Orders Grid
เผยแพร่แล้ว: 2020-02-03บ่อยครั้ง ผู้ดูแลระบบร้านค้า Magento 2 ต้องการตัวเลือกเพิ่มเติมเมื่อใช้และกำหนดตารางคำสั่งซื้อเอง การกรองตามพารามิเตอร์แบบสำเร็จรูปเฉพาะอาจกลายเป็นความท้าทายที่แท้จริง
เมื่อเร็ว ๆ นี้ นักพัฒนา Magento ได้ติดต่อฉันด้วยคำถาม เขาพยายามขยายตารางการสั่งซื้อบน Magento 2.3.1 โพสต์เก่าที่มีอยู่บนเว็บไม่ได้ช่วยอะไร ปกติแล้ว Magento ได้เปลี่ยนแปลงไปมากตั้งแต่สองปีที่ผ่านมา
จากคำถามของเขา ฉันขอเสนอให้คุณดูวิธีแก้ปัญหาสำหรับกรณีเฉพาะ:
เราจำเป็นต้องเพิ่มคอลัมน์ ― พร้อมรหัสภูมิภาคของลูกค้าที่ซื้อจนเสร็จ ― ลงในตารางใบสั่งซื้อ นอกจากนี้ ผู้ดูแลระบบร้านค้าต้องมีความเป็นไปได้ในการกรองคำสั่งซื้อตามคอลัมน์ที่เพิ่มใหม่นี้
อาจดูเหมือนง่าย แต่มีบางสิ่งที่ควรค่าแก่การใส่ใจ ตัวอย่างเช่น นักช้อปที่ซื้อสินค้าอาจไม่มีที่อยู่สำหรับจัดส่ง - ในกรณีของการสั่งซื้อเสมือนจริง หรือเราจะแสดงรายการภูมิภาคอย่างไร ทั้งหมดนี้ควรนำมาพิจารณาเมื่อเข้าสู่การพัฒนา จากคำถามที่กล่าวถึงก่อนหน้านี้ สมมติว่า:
- ผลิตภัณฑ์เสมือนจะไม่มีพื้นที่จัดส่ง ('null') สิ่งนี้จะช่วยคุณเลือกตามพารามิเตอร์นี้
- ภูมิภาคต่างๆ จะถูกแสดงรายการและมีลักษณะของรหัสโดยไม่มีการแปลงเป็นป้ายกำกับ เช่นเดียวกับที่อยู่ใน Magento 2 เริ่มต้น
*โปรดทราบว่าในตอนท้ายของบทความนี้จะมีลิงก์ไปยังโมดูลที่มีการเข้าถึงแบบเปิดบน GitHub แม้ว่าฉันจะรวมลิงก์ไว้ในย่อหน้านี้หากคุณไม่สามารถจัดการบทความนี้ให้จบ: https://github.com/mageworx/articles-extended-orders-grid
อย่างไรก็ตาม แม้จะไม่มีเวลา เราขอแนะนำให้คุณอ่านต่อ?
ดังนั้น ในการเพิ่มคอลัมน์ใหม่ในตารางคำสั่งซื้อ คุณต้อง:
สารบัญ
- 1. สร้างโมดูลใหม่
- 2. เพิ่มคอลัมน์ลงในตาราง
- คำอธิบาย
- 3. เพิ่มข้อมูลลงในคอลัมน์
- จะเพิ่มคอลัมน์พิเศษได้อย่างไร?
- [อัพเดท] จะเพิ่มคอลัมน์ด้วยข้อมูลรายการสั่งซื้อได้อย่างไร?
1. สร้างโมดูลใหม่
ขั้นแรก มาตัดสินใจเลือกโมดูลและชื่อผู้ขาย ฉันไม่ต้องการให้ฉันเลือกชื่อผู้ขาย – มันคือ MageWorx (ราวกับว่าฉันมีทางเลือก ล้อเล่น) ฉันยังคงสามารถเลือกชื่อโมดูลได้ ปล่อยให้เป็น ExtendedOrdersGrid (แต่เรามีนามสกุลเดียวกันสำหรับ Magento 2) อันที่จริง การใช้ MageWorx เป็นชื่อผู้ขายในเนมสเปซไม่ได้ให้สิทธิ์คุณในการขอรับการสนับสนุนฟรี อย่างไรก็ตาม หากสมาชิกในทีมสนับสนุนของเรามีวันหยุดสุดสัปดาห์ที่ดี คุณยังคงสามารถทดลองใช้ในวันจันทร์ได้หรือไม่
มาสร้างไดเร็กทอรีต่อไปนี้: `app/code/MageWorx/ExtendedOrdersGrid` ในการลงทะเบียนโมดูล เราจำเป็นต้องมีไฟล์มาตรฐานบางไฟล์:
> registration.php php <?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::MODULE, 'MageWorx_ExtendedOrdersGrid', __DIR__ ); > composer.json json { "name": "mageworx/module-extended-orders-grid", "description": "Extended Orders Grid Extension", "require": { "magento/module-ui" : ">=100.1.0 < 102", "magento/module-sales" : ">=100.0.0 <103" }, "type": "magento2-module", "version": "1.0.0", "license": [ "OSL-3.0", "AFL-3.0" ], "autoload": { "files": [ "registration.php" ], "psr-4": { "MageWorx\\ExtendedOrdersGrid\\": "" } } } > etc/module.xml xml <?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="MageWorx_ExtendedOrdersGrid" setup_version="1.0.0"> <sequence> <module name="Magento_Sales"/> <module name="Magento_Ui"/> </sequence> </module> </config>
โปรดทราบว่าฉันได้ตัดลิขสิทธิ์ที่เพิ่มใน IDE ของฉันโดยอัตโนมัติแล้ว ดังนั้นคุณจึงสามารถใช้รหัสนี้ได้โดยไม่มีปัญหา ?
จากนั้นรันคำสั่งสองสามคำสั่ง:
> sudo -u www-data php bin/magento module:enable MageWorx_ExtendedOrdersGrid > sudo -u www-data php bin/magento setup:upgrade
และโว้ว! ตอนนี้ สามารถเห็นโมดูลของเราใน Magento 2! อ้อ ถ้าคุณทำงานบนเซิร์ฟเวอร์ระยะไกล อย่าลืมโอนไฟล์ก่อนทำการทดสอบ
2. เพิ่มคอลัมน์ลงในตาราง
จากนั้น ใช้ Magento 2 UI ให้เพิ่มคอลัมน์ใหม่ในกริดมาตรฐาน สำหรับสิ่งนั้น ให้สร้างไฟล์:
> view/adminhtml/ui_component/sales_order_grid.xml
โดยมีเนื้อหาดังต่อไปนี้ (เราจะพูดถึงความหมายต่อไป):
xml <?xml version="1.0" encoding="UTF-8"?> <listing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd"> <columns name="sales_order_columns"> <column name="code"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item> <item name="label" xsi:type="string" translate="true">Region Code</item> <item name="sortOrder" xsi:type="number">60</item> <item name="align" xsi:type="string">left</item> <item name="dataType" xsi:type="string">text</item> <item name="visible" xsi:type="boolean">true</item> <item name="filter" xsi:type="string">text</item> </item> </argument> </column> </columns> </listing>
ที่นี่คุณต้องระบุว่าชื่อจะไม่ถูกนำออกจากที่ใด สำหรับนักพัฒนาที่มีประสบการณ์ สิ่งนี้ชัดเจน แต่สำหรับผู้ที่รู้จัก Magento 2 เท่านั้น ฉันจะเพิ่มคำอธิบายที่ส่วนท้ายของย่อหน้านี้
เราใช้โหนด "คอลัมน์" มาตรฐานเพื่อเพิ่มคอลัมน์ลงในกริด โดยจะเพิ่มคอลัมน์ใหม่ภายใต้ชื่อ "โค้ด" ด้วยเช่นกัน ต่อไป มาเขียนแอตทริบิวต์ของคอลัมน์ของเราในตาราง:
1) ส่วนประกอบ . นี่คือคลาส JS ที่รับผิดชอบในการสร้างและประมวลผลคอลัมน์นี้ ตั้งอยู่ในโมดูล Magento_Ui ตามที่อยู่ต่อไปนี้:
`ผู้ขาย/วีโอไอพี/module-ui/view/base/web/js/grid/columns/column.js`
อันที่จริง หากคุณเป็นนักพัฒนาที่อยากรู้อยากเห็น ให้พิจารณาสิ่งอื่นๆ ด้วย มีสิ่งที่น่าตื่นเต้นมากมายอยู่ที่นั่น
2) ฉลาก นี่คือบรรทัดที่มีชื่อคอลัมน์ซึ่งจะแสดงต่อผู้ใช้ปลายทาง อย่าลืมเพิ่มลงในไฟล์การแปลภาษา i18n หากสร้างคุณสมบัติ "แปล" แล้ว ?
3) เรียงลำดับ นี่คือตำแหน่งคอลัมน์ในตาราง หากโมดูลได้รับการติดตั้งบน Magento 2 ที่ไม่เคยได้รับการจัดการโดยผู้ดูแลระบบร้านค้า จะมีผล มิฉะนั้น ใน Magento 2 ที่กำลังใช้งานอยู่ คอลัมน์ของเราจะถูกเพิ่มไปยังส่วนท้ายของรายการไม่ว่าเราจะทำอะไร
4) จัดตำแหน่ง ซึ่งหมายถึงการจัดแนวเนื้อหาของคอลัมน์ ฉันเดาที่ชัดเจน
5) ประเภทข้อมูล นี่คือประเภทข้อมูลที่เราจะจัดการ ในกรณีของเรา นั่นเป็นเพียงบรรทัดข้อความ อย่างไรก็ตาม อาจเป็นรายการหรือค่าบูลีน ตลอดจนตัวเลขได้ เช่น หากเราพูดถึงปริมาณผลิตภัณฑ์
6) มองเห็นได้ นี่ไม่ใช่อะไรอื่นนอกจากการมองเห็นคอลัมน์ แต่ขึ้นอยู่กับว่าก่อนหน้านี้มีการใช้กริดหรือไม่
ข้อมูลทั้งหมดเกี่ยวกับกริดถูกเก็บไว้ในฐานข้อมูล Magento ในตาราง `ui_bookmark` ดังนั้น หากไม่มีบันทึกเกี่ยวกับคอลัมน์ของเราสำหรับกริดที่แก้ไขในขณะที่ทำการติดตั้งโมดูล อย่าคาดหวังความมหัศจรรย์ใดๆ
7) กรอง . นี่คือประเภทตัวกรอง ในที่นี้ เราระบุว่าการกรองควรทำเช่นเดียวกับข้อความปกติ ขณะรันโค้ด โค้ดจะเปลี่ยนเป็นเงื่อนไข `LIKE %value%` ของ MySQL
คำอธิบาย
ในการทำให้เรื่องยาวสั้นลง ชื่อของคอมโพเนนต์ UI แบบขยายต้องตรงกับชื่อต้นฉบับ ในกรณีของเรา มันคือ `vendor/magento/module-sales/view/adminhtml/ui_component/sales_order_grid.xml` และคำนวณจากรูทของโมดูล `view/adminhtml/ui_component/sales_order_grid.xml`
UI กริดเองถูกเพิ่มไปยังคอนโทรลเลอร์ที่ต้องการโดยใช้เลย์เอาต์ `vendor/magento/module-sales/view/adminhtml/layout/sales_order_index.xml` ดังนี้:
xml <?xml version="1.0"?> <!-- /** * Copyright Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ --> <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <update handle="styles"/> <body> <referenceContainer name="content"> <uiComponent name="sales_order_grid"/> </referenceContainer> </body> </page>
ซึ่งหมายความว่า *เพิ่มองค์ประกอบ UI นี้ภายใต้ชื่อ `sales_order_grid` ให้กับเนื้อหาของหน้า* เช่นเดียวกับในกรณีที่มีการบล็อก อย่างไรก็ตาม แทนที่จะบล็อก เรามี "uiComponent" ที่มีคุณสมบัติและข้อจำกัด
ตอนนี้ล้างแคช Magento 2 โดยใช้คำสั่งต่อไปนี้:
> sudo -u www-data php bin/magento cache:clean config
และตรวจสอบผลลัพธ์ในตารางคำสั่งซื้อ:
3. เพิ่มข้อมูลลงในคอลัมน์
คุณอาจสังเกตเห็นว่าคอลัมน์ปรากฏขึ้นแล้ว แต่เนื้อหาของคอลัมน์ดูไม่เป็นไปตามที่คาดไว้...ไม่มีข้อมูลแสดงอยู่ที่นั่นเลย ยุติธรรมดี เราไม่ได้เพิ่มอะไรเลย ดังนั้นจึงไม่มีเนื้อหาอยู่ที่นั่น
มาลงที่การเขียนปลั๊กอินง่ายๆ ที่จะช่วยคุณกรอกคอลัมน์ของเรา สำหรับสิ่งนั้น มาดูคิวรีคอลเลกชันกริด ทำการเข้าร่วมภายในตารางและกริดที่ต้องการ ปลั๊กอินจะมีลักษณะดังนี้:
> app/code/MageWorx/ExtendedOrdersGrid/Plugin/AddDataToOrdersGrid.php
php <?php namespace MageWorx\ExtendedOrdersGrid\Plugin; /** * Class AddDataToOrdersGrid */ class AddDataToOrdersGrid { /** * @var \Psr\Log\LoggerInterface */ private $logger; /** * AddDataToOrdersGrid constructor. * * @param \Psr\Log\LoggerInterface $customLogger * @param array $data */ public function __construct( \Psr\Log\LoggerInterface $customLogger, array $data = [] ) { $this->logger = $customLogger; } /** * @param \Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory $subject * @param \Magento\Sales\Model\ResourceModel\Order\Grid\Collection $collection * @param $requestName * @return mixed */ public function afterGetReport($subject, $collection, $requestName) { if ($requestName !== 'sales_order_grid_data_source') { return $collection; } if ($collection->getMainTable() === $collection->getResource()->getTable('sales_order_grid')) { try { $orderAddressTableName = $collection->getResource()->getTable('sales_order_address'); $directoryCountryRegionTableName = $collection->getResource()->getTable('directory_country_region'); $collection->getSelect()->joinLeft( ['soa' => $orderAddressTableName], 'soa.parent_id = main_table.entity_id AND soa.address_type = \'shipping\'', null ); $collection->getSelect()->joinLeft( ['dcrt' => $directoryCountryRegionTableName], 'soa.region_id = dcrt.region_id', ['code'] ); } catch (\Zend_Db_Select_Exception $selectException) { // Do nothing in that case $this->logger->log(100, $selectException); } } return $collection; } }
มันจะอ้างถึงคลาสต่อไปนี้:
'Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory'
> etc/adminhtml/di.xml xml <?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> <!-- Plugins --> <!-- Adds additional data to the orders grid collection --> <type name="Magento\Framework\View\Element\UiComponent\DataProvider\CollectionFactory"> <plugin name="mageworx_extended_orders_grid_add_data_to_orders_grid" type="MageWorx\ExtendedOrdersGrid\Plugin\AddDataToOrdersGrid" sortOrder="10" disabled="false"/> </type> </config>
ปลั๊กอินทำงานด้วยวิธีต่อไปนี้:
เนื่องจากจะจับคอลเลกชันทั้งหมดได้อย่างแน่นอน เรามาเพิ่มการตรวจสอบความถูกต้องให้กับตาราง `sales_order_grid` ที่จำเป็น เมื่อมันถูกค้นพบและวีโอไอพีพยายามที่จะรับข้อมูลเกี่ยวกับสิ่งนี้ เราจะทำการเข้าร่วมของตารางด้วยที่อยู่ `sales_order_address` โดย`order_id` (`entity_id` ในตาราง `sales_order_grid` และ `parent_id` ในตาราง `sales_order_address` ( `soa` นามแฝง)) ตอนนี้ เรามีสิทธิ์เข้าถึงข้อมูลที่อยู่สำหรับจัดส่งคำสั่งซื้อของลูกค้า ซึ่งเราสามารถใช้เพื่อกำหนด `region_id` ซึ่งอยู่ในตาราง `sales_order_address` ตัวเลขนี้สอดคล้องกับดัชนีในตาราง "directory_country_region" (นามแฝง "dcrt") เนื่องจากเราต้องการรหัสภูมิภาคนี้จากตารางดังที่กล่าวไว้ข้างต้น เรามาเชื่อมต่อคอลัมน์ 'รหัส' กัน คอลัมน์ที่แม่นยำนี้จะได้รับผลลัพธ์ (สอดคล้องกับค่า "คอลัมน์" ใน "sales_order_grid.xml")
จากนั้นล้างแคช:
> sudo -u www-data php bin/magento cache:clean config
เข้าสู่ระบบแผงผู้ดูแลระบบไปยังตารางการสั่งซื้อ หากทำทุกอย่างถูกต้องแล้ว เราจะเห็นรหัสภูมิภาคแสดงขึ้น:
เข้าถึงโมดูลได้ฟรีบน GitHub: https://github.com/mageworx/articles-extended-orders-grid
ไซด์โน๊ตสำคัญ!
ในการเพิ่มข้อมูลลงในคอลัมน์นี้ จำเป็นต้องได้รับคอลัมน์ 'your_column_name' และข้อมูลที่จำเป็นทั้งหมดที่เพิ่มเมื่อสร้างคอลเล็กชัน นั่นคือ คุณต้องทำบางอย่างที่แตกต่างออกไป – แทนที่ชื่อตารางและเขียนการเข้าร่วมของคุณเอง นอกจากนี้ อย่าลืมแก้ไขชื่อคอลัมน์ในไฟล์ `sales_order_grid.xml` หากจำเป็น
จะเพิ่มคอลัมน์พิเศษได้อย่างไร?
หากคุณตัดสินใจที่จะเพิ่มอีกหนึ่งคอลัมน์ โปรดปฏิบัติตามหลักเกณฑ์ที่อธิบายไว้ใน Git commit ต่อไปนี้: https://github.com/mageworx/articles-extended-orders-grid/commit/d31c364a25ce493ab64731c5ca0481e146dbbac3
เราได้เพิ่มคอลัมน์ telephone
ลงในกริดจากตาราง sales_order_address
สำหรับที่อยู่ของประเภท shipping
ดังที่คุณเห็นในโค้ดการคอมมิต ไม่จำเป็นต้องแก้ไขโค้ดที่สำคัญ
นอกจากนี้ คอลัมน์เหล่านี้สามารถส่งออกได้สำเร็จจากอินเทอร์เฟซ 'ตารางการสั่งซื้อ' มาตรฐาน
นี่คือลักษณะของตารางที่มีคอลัมน์ 'โทรศัพท์':
ในภาพหน้าจอด้านล่าง คุณสามารถดูคำสั่งซื้อเดียวกันที่ส่งออกไปยังไฟล์ .csv:
[อัพเดท] จะเพิ่มคอลัมน์ด้วยข้อมูลรายการสั่งซื้อได้อย่างไร?
อย่างที่คุณทราบ คำสั่งซื้อทั้งหมดมีจำนวนสินค้า เริ่มจากหนึ่งถึงออกเกินจำนวน (ใช่ ความฝันของพ่อค้า) แต่เราจะแสดงข้อมูลนั้นในตารางคำสั่งซื้อเพื่อเริ่มการค้นหาหรือเรียกใช้การวิเคราะห์ได้ง่ายขึ้นได้อย่างไร
เราไม่สามารถเพิ่มคอลัมน์เหมือนที่เราทำไว้ก่อนหน้านี้ได้เนื่องจากเราได้รับชื่อผลิตภัณฑ์หรือ SKU เพียงชื่อเดียวในแต่ละแถวในกรณีนั้น หรือบันทึกคำสั่งซื้อจะถูกทำซ้ำ ... เราไม่ต้องการความยุ่งเหยิงนั้นเช่นกัน
ดังนั้นฉันจะพยายามอธิบายว่าเราจะทำอย่างนั้นได้อย่างไร (ในความคิดของฉัน)
สมมติว่าเราต้องการคอลัมน์ข้อมูล 'ชื่อผลิตภัณฑ์' ในตารางคำสั่งซื้อ
ขั้นแรก ให้เพิ่มคอลัมน์ใหม่ในข้อกำหนด sales_order_grid
ตามที่เราทำก่อนหน้านี้:
<columns> .... <column name="name"> <argument name="data" xsi:type="array"> <item name="config" xsi:type="array"> <item name="component" xsi:type="string">Magento_Ui/js/grid/columns/column</item> <item name="filter" xsi:type="string">text</item> <item name="label" xsi:type="string" translate="true">Product Name</item> <item name="visible" xsi:type="boolean">false</item> <item name="sortOrder" xsi:type="number">70</item> </item> </argument> </column> </columns>
จากนั้น สิ่งที่เราต้องทำคือสร้างการสืบค้นข้อมูลที่ถูกต้องสำหรับคอลัมน์ใหม่ของเรา ต้องมีชื่อของแต่ละผลิตภัณฑ์ที่ซื้อตามลำดับ คั่นด้วยเครื่องหมายจุลภาค มีความสามารถในการค้นหาด้วยค่าคอลัมน์นั้น เป็นต้น มาสร้างวิธีการใหม่ในปลั๊กอิน mageworx_extended_orders_grid_add_data_to_orders_grid
กัน:
/** * Adds products name column to the orders grid collection * * @param OrderGridCollection $collection * @return OrderGridCollection */ private function addProductsNameColumn(OrderGridCollection $collection): OrderGridCollection { return $collection; }
และตั้งชื่อวิธีการนั้นภายในเนื้อหาของวิธีการดั้งเดิม:
if ($collection->getMainTable() === $collection->getResource()->getTable('sales_order_grid')) { try { $orderAddressTableName = $collection->getResource()->getTable('sales_order_address'); ... // Add product's name column $this->addProductsNameColumn($collection); } catch (\Zend_Db_Select_Exception $selectException) { ...
เพื่อให้ได้ข้อมูลที่ต้องการในคอลัมน์เดียว เราต้องสร้างการเลือกย่อยด้วยสองคอลัมน์: order_id
และ name
(ชื่อผลิตภัณฑ์) ในการเลือกแต่ละรายการ ซึ่งสามารถเข้าร่วมกับคอลเล็กชันหลักได้ในภายหลัง:
// Get original table name $orderItemsTableName = $collection->getResource()->getTable('sales_order_item'); // Create new select instance $itemsTableSelectGrouped = $collection->getConnection()->select(); // Add table with columns which must be selected (skip useless columns) $itemsTableSelectGrouped->from( $orderItemsTableName, [ 'name' => new \Zend_Db_Expr('GROUP_CONCAT(DISTINCT name SEPARATOR \',\')'), 'order_id' => 'order_id' ] ); // Group our select to make only one column for one order $itemsTableSelectGrouped->group('order_id');
ชี้แจง:
-
$collection->getConnection()->select()
line จะสร้างอินสแตนซ์Magento\Framework\Db\Select
ใหม่
สิ่งนี้จำเป็นเนื่องจากเราไม่สามารถใช้การเลือกเดิมจากคอลเล็กชันได้ เนื่องจากมีข้อมูลอยู่ภายใน และการแก้ไขใดๆ จะทำให้เกิดข้อผิดพลาด - คอลัมน์
name
ต้องมีชื่อผลิตภัณฑ์ทั้งหมดสำหรับลำดับที่ระบุ กล่าวคือ ต้องจัดกลุ่มโดยใช้นิพจน์\Zend_Db_Expr('GROUP_CONCAT(DISTINCT name SEPARATOR \',\')')
เพื่อจุดประสงค์นั้น เรากำลังเพิ่มgroup('order_id')
ให้กับรายการที่เลือกในภายหลัง หากไม่มีการจัดกลุ่ม เราจะใช้GROUP_CONCAT
ไม่ได้
ตอนนี้ เราสามารถเพิ่มการเลือกย่อยของเราลงในคอลเล็กชันหลักได้ และมันจะเป็นจุดสิ้นสุดทางตรรกะของเมธอด addProductsNameColumn
:
// Add our sub-select to main collection with only one column: name $collection->getSelect() ->joinLeft( ['soi' => $itemsTableSelectGrouped], 'soi.order_id = main_table.entity_id', ['name'] ); return $collection;
ชี้แจง:
-
soi
เป็นนามแฝงสำหรับตารางเทียมของเรา -
order_id
เป็นกุญแจสำคัญ ซึ่งเราใช้เชื่อมโยงตารางหลัก (ตาราง) ของเรากับข้อมูลรายการสั่งซื้อ -
['name']
เป็นคอลัมน์เดียวที่เพิ่มลงในผลลัพธ์ เนื่องจากเราไม่ต้องการข้อมูลอื่น
ผลลัพธ์สุดท้ายมีอยู่ในที่เก็บอย่างเป็นทางการของตัวอย่างนั้น
นี่คือลิงค์ไปยังคอมมิตเฉพาะ: https://github.com/mageworx/articles-extended-orders-grid/commit/0cdffcd4ba66cacb2fd857ba7626fdbcfc0d6fe3
คอลัมน์นั้นมีลักษณะอย่างไรในโฮสต์การแสดงละครของเรา:
และนี่คือผลลัพธ์ของการส่งออก (CSV):
ต่อไปนี้คือลักษณะของข้อความค้นหาเมื่อพยายามค้นหาคำสั่งซื้อด้วยผลิตภัณฑ์ "Black" (บนโฮสต์สำหรับนักพัฒนาของเรา):
เลือก main_table
.*, soat
telephone
, ดีซีอาร์ dcrt
. code
soi
. name
FROM sales_order_grid
AS main_table
ซ้ายเข้าร่วม sales_order_address
AS soat
ON soat.parent_id = main_table.entity_id และ soat.address_type = 'การจัดส่ง'
ซ้ายเข้าร่วม directory_country_region
AS dcrt
ON soat.region_id = dcrt.region_id
LEFT JOIN (เลือก GROUP_CONCAT(DISTINCT name SEPARATOR ',') AS name
, sales_order_item
. order_id
FROM sales_order_item
GROUP BY order_id
) AS soi
ON soi.order_id = main_table.entity_id
soi
.ไหน . name
LIKE '%Black%'
เห็นได้ชัดว่านี่ไม่ใช่วิธีที่เร็วที่สุดในการส่งออกข้อมูล อย่างไรก็ตาม นั่นอาจเป็นวิธีที่ง่ายที่สุด วิธีที่ดีที่สุดคือการรวบรวมข้อมูลเกี่ยวกับชื่อผลิตภัณฑ์ในคอลัมน์ที่แยกจากกันของตารางที่แยกจากกัน (order_id, products_name) และเพิ่มตารางนี้โดยไม่มีการจัดกลุ่มเพิ่มเติมและการเลือกย่อยใดๆ
เพื่อจุดประสงค์นั้น เราเพิ่มกลุ่ม ('order_id') ลงในการเลือกของเรา (ที่ส่วนท้ายของโค้ดวิธีการ)
การเลือกหมายถึงองค์ประกอบ
กลุ่มหมายถึงวิธีการเลือก
ฉันเดาว่านั่นคือมัน หากคุณมีคำถามหรือคำขอใด ๆ โปรดแสดงความคิดเห็นในช่องแสดงความคิดเห็น