วิธีตัดตารางวีโอไอพีโดยใช้คอลเล็กชัน?


23

ฉันมีตารางที่กำหนดเอง ฉันต้องการตัดทอนตารางโดยใช้ Magento collectionโดยไม่มีการสืบค้น SQL

หวังว่าบางคนจะให้ข้อมูลที่เป็นประโยชน์


คุณหมายถึงคุณต้องการลบบางแถวตามเงื่อนไขหรือไม่?
Subesh Pokhrel

ไม่ฉันต้องลบระเบียนทั้งหมดและรหัสเพิ่มอัตโนมัติเริ่มด้วย 1
VijayS91

คำตอบ:


18

Magento ไม่มีการสนับสนุนสำหรับสิ่งนี้ (เท่าที่ฉันรู้)
แต่คุณสามารถใช้เมธอดในโมเดลรีซอร์สของคุณ (ไม่ใช่โมเดลรีซอร์สคอลเล็กชัน) ที่จะตัดทอนตาราง
บางสิ่งเช่นนี้

public function truncate() {
    $this->_getWriteAdapter()->query('TRUNCATE TABLE '.$this->getMainTable());
    return $this;
}

จากนั้นคุณสามารถโทรหาได้ในรหัสของคุณ:

Mage::getResourceModel('[module]/[entity]')->truncate();

แต่นี่เป็นวิธีที่อันตรายมาก ใบtruncateแจ้งยอดแบ่งการทำธุรกรรมดังนั้นจึงไม่สามารถย้อนกลับในกรณีที่คุณต้องการ
ฉันขอแนะนำให้ลบทุกเอนทิตีในตารางแทน

$collection = Mage::getModel('[module]/[entity]')->getCollection();
foreach ($collection as $item) {
    $item->delete();
}

ข้อเสียของสิ่งนี้คือมันไม่ได้รีเซ็ตรหัสเพิ่มของตาราง แต่มันปลอดภัยกว่า

แก้ไข
ในการอัปเดตรหัสเพิ่มของตารางหลักคุณสามารถเพิ่มวิธีการใหม่ในรูปแบบทรัพยากรของคุณที่ทำสิ่งนี้

public function changeAutoIncrement($increment = 1) {
    $this->_getWriteAdapter()->query('ALTER TABLE '.$this->getMainTable().' AUTO_INCREMENT = '. $increment);
}

จากนั้นเรียกวิธีการของคุณในรหัส:

Mage::getResourceModel('[module]/[entity]')->changeAutoIncrement();

2
คุณสามารถบอกนางแบบสามรุ่นใน magento ได้ไหมขอบคุณล่วงหน้า
MeenakshiSundaram R

3
@MeenakshiSundaramR มีรูปแบบเอนทิตี ตัวอย่าง: Mage_Catalog_Model_Product. มีรูปแบบทรัพยากร ตัวอย่าง: Mage_Catalog_Model_Resource_Product. Mage_Catalog_Model_Resource_Product_Collectionและมีรูปแบบการใช้ทรัพยากรคอลเลกชัน
Marius

2
@Marius คุณสามารถบอกฉันได้อย่างไรว่าจะอัปเดตรหัสเพิ่มอัตโนมัติ (หมายถึงเริ่มต้นด้วย 1) ในคอลเลกชันคุณภาพเยี่ยม
VijayS91

2
@VijayS ดูการอัปเดตคำตอบของฉัน
Marius

@Marius ฉันมีข้อสงสัย แล้ว Flat model และ EAV model คืออะไร?
MeenakshiSundaram R

11
$model = Mage::getModel('[module]/[model]');
$resource = $model->getResource();
$connection = $resource->getReadConnection();
/* @see Varien_Db_Adapter_Pdo_Mysql */
$connection->truncateTable($resource->getMainTable());
$connection->changeTableAutoIncrement($resource->getMainTable(), 1);

หมายเหตุ: MySQL รีเซ็ตค่าการรวมอัตโนมัติเป็น1เมื่อตัดทอนตารางดังนั้นจึงไม่จำเป็น แต่changeTableAutoIncrementอาจมีประโยชน์หากมีคนต้องการให้ AI เริ่มต้นด้วยค่าอื่น


แก้ไข:

คำถามนี้ถูกติดแท็กด้วย / ... เพียงตอบคำถามให้สมบูรณ์:

  • changeTableAutoIncrement ถูกเพิ่มใน 1.8.0.1
  • truncateTable ถูกเพิ่มใน 1.6.0.0-alpha1

-1

ฉันได้สร้างแบบจำลองและสำหรับการพัฒนาบางอย่างฉันต้องใช้วิธีการลบ มันง่ายมาก ๆ. ฉันลองลบตามเงื่อนไข แต่ฉันไม่ได้รับรหัสที่แน่นอน แต่ฉันใช้รหัสต่อไปนี้ซึ่งจะตอบสนองความต้องการของคุณสำหรับการลบแบบมีเงื่อนไข

$items = Mage::getModel('custom/csaabandonedcart')->getCollection()
    ->addFieldToFilter('csa_id',Mage::getSingleton('customer/session')
    ->getCustomerId())->addFieldToFilter('customer_id', $retailer)
    ->addFieldToFilter('product_id', $spid);

foreach ($items as $item) {
        $item->delete();
}

1
ฉันกำลังถามเกี่ยวกับการตัดตาราง ไม่ต้องลบบันทึก
VijayS91

คุณสามารถทำได้โดยใช้รหัสต่อไปนี้ หากคุณพิจารณารหัสข้างต้น $ items-> ตัด ();
Sapnandu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.