Таблицы с первичным ключом без автоинкремента


9

Я создал таблицу в Magento, в которой есть два поля: id и date. Дата просто установлена ​​на сейчас, но идентификатор на самом деле является внешним ключом, прикрепленным к идентификатору заказа.

Моя проблема в том, что Magento не сохраняет эти объекты, никаких ошибок не происходит, но ничего не добавляется в базу данных.

Ответы:


17

Проблема здесь заключается в том, что функция сохранения ресурса magento проверяет, установлен ли для первичного ключа автоматическое увеличение, а затем удаляет его из сохраняемых данных, если это так.

В Mage_Core_Model_Resource_Db_Abstract::saveвы можете увидеть, как это имеет дело с$this->_isPkAutoIncrement

/**
 * Not auto increment primary key support
 */
if ($this->_isPkAutoIncrement) {
    $data = $this->_prepareDataForSave($object);
    unset($data[$this->getIdFieldName()]);
    $this->_getWriteAdapter()->update($this->getMainTable(), $data, $condition);
} else {
    $select = $this->_getWriteAdapter()->select()
        ->from($this->getMainTable(), array($this->getIdFieldName()))
        ->where($condition);
    if ($this->_getWriteAdapter()->fetchOne($select) !== false) {
        $data = $this->_prepareDataForSave($object);
        unset($data[$this->getIdFieldName()]);
        if (!empty($data)) {
            $this->_getWriteAdapter()->update($this->getMainTable(), $data, $condition);
        }
    } else {
        $this->_getWriteAdapter()->insert($this->getMainTable(), $this->_prepareDataForSave($object));
    }
}

Поэтому, чтобы исправить мою проблему, я просто должен установить $_isPkAutoIncrementдля ресурса моей модели значение false, и Magento сохранит PK в данных и сохранит их в таблице.


10/10 будет снова голосовать.
отметки

@ отметки это все еще поражает меня тем, что я натыкаюсь на подобные вещи
Дэвид Мэннерс

какой хороший ответ и вопрос + 1 голос за Q & A
Амит Бера
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.