Магический сеттер Magento обновил только некоторые столбцы БД - PullRequest
5 голосов
/ 07 марта 2011

У меня есть пользовательская таблица mysql, которую мы назовем module_identifiers, и соответствующая модель в моем модуле под названием Идентификаторы.Это мой сценарий установки:

$installer = $this;

$installer->startSetup();
$installer->run("
CREATE TABLE `{$installer->getTable('module_identifiers')}` (
  `module_identifier_id` int(11) NOT NULL AUTO_INCREMENT,
  `identifier` varchar(255) NOT NULL,
  `customer_id` int(11) unsigned NOT NULL,
  `profile_name` varchar(100) NOT NULL,
  `provider` varchar(50) NOT NULL,
  PRIMARY KEY (`module_identifier_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
");
$installer->endSetup();

В моем модуле / модель / Identifiers.php

class Namespace_Module_Model_Identifiers extends Mage_Core_Model_Abstract {

    protected function _construct() {
        $this->_init('module/identifiers');
    }

}

и в модуле / модель / Mysql4 / Identifiers.php

class Namespace_Module_Model_Mysql4_Identifiers extends Mage_Core_Model_Mysql4_Abstract {

    protected function _construct() {
        $this->_init('module/identifiers', 'module_identifier_id');
    }

}

Поэтому, когда я хочу написать в эту таблицу, я делал следующее:

Mage::getModel('module/identifiers')
    ->setIdentifier($profile['identifier'])
    ->setCustomerId($customer_id)
    ->save();

И это работало замечательно, пока я не добавил столбцы provider и profile_name, и они никогда не обновляются с этим:

Mage::getModel('module/identifiers')
    ->setIdentifier($profile['identifier'])
    ->setProvider($profile['provider'])
    ->setProfileName($profile['profile_name'])
    ->setCustomerId($customer_id)
    ->save();

Я удалил свою пользовательскую таблицу, удалил скрипт установки моего модуля из списка core_resource, чтобы он снова запустился (что он и сделал), и новые строки добавлены в базу данных, но онипропуская данные для моих новых столбцов.Да, я проверил, что мой массив $ profile содержит правильные данные.Что я делаю не так?

Ответы [ 2 ]

18 голосов
/ 11 мая 2012

Если кто-то и придет сюда, чтобы найти ответ на эту очень расстраивающую проблему, то это вот что.

Magento кэширует описания своих таблиц в var / cache (даже если у вас на сервере не включены никакие кэши).) (см. lib / Varien / Db / Adapter / Pdo / Mysql.php :: descriptionTable ()).Когда он идет на вставку или обновление какой-либо таблицы, он сначала проверяет этот кэш, чтобы увидеть, готово ли к нему описание таблицы.Если он находит его, он возвращает кэшированное описание таблицы, и если какие-либо поля в массиве, который вы передаете в $ model-> save (), не появляются в этом кэшированном описании, они не будут вставлены вТаблица, приводящая к описанным выше симптомам.

Так что, если вы возитесь с проблемой вставки столбцов в phpMyAdmin (или даже перезапускаете скрипт установки), Magento не увидит их и не вставит ваши данные.

Абсурдно простое решение состоит в том, чтобы просто rm -rf var/cache/*

РЕДАКТИРОВАТЬ 2014.01.10: Если ваш сайт использует memcache, этот кэш необходимо будет также очистить для внесения измененийэффект.

0 голосов
/ 08 марта 2011

Пройдите через базу знаний Статья о моделях , которая проведет вас через каждый шаг, необходимый для настройки базовой модели.Затем протестируйте свою отдельную модель в отдельности, чтобы убедиться в ее правильном сохранении / настройке, а затем интегрируйте эту работу в остальную часть вашего модуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...