Сохранение модели с использованием setData и addData без добавления в базу данных
-
13-12-2019 - |
Вопрос
У меня есть модель, и я пытался добавить ее в базу данных.Когда я выполняю PHP-скрипт для добавления, все работает нормально, никаких исключений не возникает.Но данные не добавляются в базу данных, которую я проверил с помощью MySQL.
Я попытался отследить запросы MySQL и обнаружил, что в обоих случаях, setData и addData, Magento вызывает команду обновления, а не команду вставки.Почему он так себя ведет?Возможно ли, что такое поведение связано с реализацией модели?
Фрагмент кода для добавления данных –
$data = array('appid'=>'new_appid','custid'=>1,'info'=>'info');
$model = Mage::getModel('interface/data')->setData($data);
try {
$insertid = $model->save()->getId();
echo "Data Succesfull inserted. Insert Id : ".$insertid;
}
catch (Exception $e){
echo $e->getMessage();
}
Решение
Это то, что вы сделали здесь
$data = array('appid'=>'new_appid','custid'=>1,'info'=>'info');
$model = Mage::getModel('interface/data')->setData($data);
$model->save();
Вот я предполагаю appid
это primary_key
всего interface/data
.
Что это за код?
По сути, вы здесь создаете экземпляр своей сущности, устанавливая для нее какое-то значение, а затем выполняете действие сохранения.
Что происходит на самом деле!
То, что вы ожидаете, это ВСТАВКА, но из-за данных, доступных объекту, Magento попытается выполнить ОБНОВЛЯТЬ по умолчанию.
Почему так происходит?
Это потому, что у вашей организации есть primary_key
(т.е. appid
) уже установлено ваше пользовательское значение. new_appid
.Поскольку primary_key
установлен, Magento по умолчанию, предположим, что вы хотите выполнить UPDATE
.Поэтому он попытается найти запись с appid = 'new_appid'
.Но эта операция завершится неудачей, поскольку таких данных нет в базе данных.
Как вы можете это преодолеть?
Но есть способ выполнить INSERT вместо UPDATE, если установлен первичный ключ.Для этого вам необходимо установить _isPkAutoIncrement
к false
.По умолчанию это значение установлено на yes
что указывает на то, что нам нужно обновление, если установлен первичный ключ.установив это значение на false
сообщает Magento, что мне нужна ВСТАВКА, а не ОБНОВЛЕНИЕ.Поэтому поместите это в файл модели.
protected $_isPkAutoIncrement = false;
Другие советы
Magento сделает обновление, если текущий объект уже имеет идентификационный набор. Он будет правенно попытаться выполнить обновление существующей записи, как указано в существующем идентификаторе.
Поскольку я не вижу определение модели вашего ресурса, или ваше определение таблицы, я не знаю, что вы определили как идентификатор строки по умолчанию.(Обычно это entity_id)
- это поле идентификатора по умолчанию вашей таблицы Auto Incremental?
Кто-нибудь из полей, которые вы заполняете с вашим массивом, поле, которое вы используете для поля AUTO_INCREMENT в DB?
Если это так, удалите это поле формируют массив, который затем вызовет Magento, чтобы сделать вставку.
Когда пользователь создает модель в Magento, она ожидает, что основной ключ должен быть полевым полем AUTO RECREMPRETRY.Если у нас нет клавиши автоматического приращения, то нам нужно понадобиться установить флаг _ispkautoIncrement на объекте DB для false.
Для Сохранить вызов - если флаг является false Magento, проверит таблицу для строки с значением по умолчанию.Если это там, это сделает обновление, в противном случае это будет пронзительно.