Magento의 ORM을 사용하여 특정 ID 필드 삽입


14

Magento의 간단한 ORM ( Mage_Core_Model_AbstractMage_Core_Model_Resource_Abstract)을 사용하여 특정 기본 키로 모델 행을 삽입 하는 방법이 있습니까?

예를 들어, 빈 Magento 시스템에 대해 다음을 실행 한 경우

Mage::getModel('core/website')->setData(array (
    'website_id' => 2,
    'code' => 'foo',
    'name' => 'Main Website',
    'sort_order' => 0,
    'default_group_id' => 1,
    'is_default' => 1,
)); 

나는 core_website테이블에 새로운 엔트리를 기대할 것이다 . 그러나 마 젠토는 여기서 아무 것도하지 않습니다.

리소스를 파고 들자 데이터베이스 리소스 클래스 에서이 문제에 빠져있는 것처럼 보입니다.

#File: app/code/core/Mage/Core/Model/Resource/Db/Abstract.php
if (!is_null($object->getId()) && (!$this->_useIsObjectNew || !$object->isObjectNew())) {
    //update stuff here
}
else
{
    //insert stuff here
}

모델에 ID가 있고 (즉, 특정 ID를 삽입하고 있음) _useIsObjectNew거짓으로 하드 코딩되어 있기 때문에 저장 요청은 항상 경로로 라우팅됩니다 insert.

기본 Magento 모델을 사용하여 강제로 삽입하는 방법이 있습니까? (다시 쓰기 / 클래스 교체없이).

예, 원시 SQL은 옵션이지만 이벤트 기능이 손실됩니다.


자동 증가 필드에 ID를 할당하려고하는 이유는 무엇입니까? 이것이 다운 스트림 종속성 인 경우 레코드를 작성한 다음 자동 생성 된 PK를 검색하지 않아야합니까?
Ralph Tice

@RalphTice 그렇습니다. 아마 매일 사용하는 것이 옳을 것입니다.
Alan Storm

답변:


5

그래 ( 편집 : ) 트릭은 사용하는 Mage_Core_Model_Abstractid 필드가없는 서브 클래스를 자원 모델이 기대하는 :

$evil = Mage::getModel('core/store'); // that's a store object, baby!
$evil->setData(
    array (
        'website_id' => 99,
        'code' => 'foo',
        'name' => 'Main Website9',
        'sort_order' => 0,
        'default_group_id' => 1,
        'is_default' => 1,
    )
);

Mage::getResourceModel('core/website')->forsedSave($evil);

Mage::dispatchEvent('website_save_commit_after', [...])핵심에서 소비되는 것으로 보이는 사건 일뿐입니다. 다음과 같이 간단 할 수 있습니다

Mage::getModel('core/website')->setData($evil->getData())->afterCommitCallback();

어쨌든 샤워가 필요합니다.


1
일단 당신이 깨끗해지면 – 나는 그것을 잘 모르겠습니다 – forsedSave gist.github.com/astorm/5219357 에서 비슷한 id 확인이 있습니다 . 이것이 당신에게 효과가 있었습니까, 아니면 단지 이론입니까?
Alan Storm

더 명확하게하기 위해 내 대답을 편집했습니다.
benmarks

... 그리고 그것은 나를 위해 일했다.
benmarks

아 하, 그게 내 코드를 복사하여 붙여 넣는 대신 입력하면 얻는 것입니다. 이것을 시작점으로 사용 Varien_Object하면 다른 모델 클래스 대신 사용하지 말고 리소스의 감가 상각되지 않은 save메소드 를 호출 해야하는 이유가 있습니까?
Alan Storm

그리고 위의 내 자신의 질문에 대답하면 일반 리소스의 save 메소드 Mage_Core_Model_Abstract에 데이터 배열에 대한 유형 힌트 가 있기 때문 입니다.
Alan Storm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.