Сохранение модели с использованием setData и addData без добавления в базу данных

magento.stackexchange https://magento.stackexchange.com//questions/71344

  •  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, проверит таблицу для строки с значением по умолчанию.Если это там, это сделает обновление, в противном случае это будет пронзительно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top