如何使用集合截断magento表?


Answers:


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();
}

不利的一面是它不会重置表的增量ID。但这更安全。

编辑
要更新主表的增量ID,您可以在资源模型中添加执行以下操作的新方法。

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

然后在代码中调用您的方法:

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

2
您能提前告诉我三种类型的模型吗?
MeenakshiSundaram R

3
@MeenakshiSundaramR。有实体模型。范例:Mage_Catalog_Model_Product。有资源模型。范例:Mage_Catalog_Model_Resource_Product。还有收集资源模型Mage_Catalog_Model_Resource_Product_Collection
马里斯(Marius)

2
@Marius您能告诉我如何更新magento集合中可用的自动增量ID(其开头为1)。
VijayS91 2014年

2
@VijayS。请参阅我对答案的更新。
马里乌斯

@Marius我有一个疑问。那么什么是Flat模型和EAV模型?
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

我已经创建了一个模型,对于某些开发,我必须实现delete方法。这很容易。我也尝试条件删除,但我没有得到确切的代码。但是我正在使用以下代码,它将满足您有条件删除的要求。

$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-> truncate();
Sapnandu 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.