컬렉션을 사용하여 마 젠토 테이블을 자르는 방법은 무엇입니까?


23

사용자 정의 테이블이 있습니다. SQL 쿼리없이 Magento 컬렉션사용하여 테이블을 자르고 싶습니다 .

누군가가 유용한 정보를 제공하기를 바랍니다.


어떤 조건에 따라 일부 행을 삭제 하시겠습니까?
Subesh Pokhrel 2015

아니오, 모든 레코드를 삭제해야하며 자동 증분 ID는 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();
}

이것의 단점은 테이블의 증분 ID를 재설정하지 않는다는 것입니다. 그러나 더 안전합니다.

EDIT .
기본 테이블의 증분 ID를 업데이트하려면 이와 같은 작업을 수행하는 새 모델을 자원 모델에 추가 할 수 있습니다.

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

그런 다음 코드에서 메소드를 호출하십시오.

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

2
미리 magento.thanks에서 세 가지 유형의 모델을 알려 주실 수 있습니까?
MeenakshiSundaram R

3
아리따움 엔터티 모델이 있습니다. 예 : Mage_Catalog_Model_Product. 자원 모델이 있습니다. 예 : Mage_Catalog_Model_Resource_Product. 그리고 콜렉션 자원 모델이 Mage_Catalog_Model_Resource_Product_Collection있습니다.
Marius

2
@Marius magento 컬렉션에서 사용할 수있는 자동 증분 ID (1로 시작한다는 의미)를 업데이트하는 방법을 알려주십시오.
VijayS91

2
@VijayS. 답변에 대한 내 업데이트를 참조하십시오.
Marius

@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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.