Quelle est la bonne façon de mettre à jour une valeur pour qu'elle soit NULL sur un modèle Magento?


12

J'ai un problème pour obtenir la valeur d'un modèle personnalisé à mettre à jour vers NULL.

$model = Mage::getModel('custom/model')->load($id);
$model->setCustomValue(NULL);
$model->save();

Ce code ne met pas à jour le champ custom_valuedans la base de données et la valeur de la base de données accepte les valeurs NULL (la définition manuelle de NULL dans la base de données fonctionne correctement).

EDIT: Comme Tim mentionne ci-dessous en utilisant Zend_Db_Expr("NULL")ne définit la valeur à null, quelqu'un pourrait-il expliquer pourquoi cela est requis dans Magento et pas simplement un php NULL?


essayez simplement $ model-> setCustomValue ("");
Mufaddal

Le type du champ de table est doubleet j'ai essayé d'autres types numériques comme decimalet faire $model->setCustomValue("");définit la valeur sur0
Invoke

7
Et alors $null = new Zend_Db_Expr("NULL");?
user487772

2
@Invoke, pour répondre à votre réponse, si vous la définissez uniquement sur "NULL", Magento pensera seulement que vous ne voulez pas mettre à jour la valeur. Comme Tim l'a suggéré, vous devez spécifier que c'est la base de données "NULL" que vous souhaitez définir.
Mayers

Merci @ mayers-dev, comportement intéressant. Je suppose qu'il a été conçu comme une clause de sortie si vous devez annuler la mise à jour prévue tout en générant la valeur elle-même.
Invoquer le

Réponses:


2

C'est, comme si souvent, un problème isset()vs array_key_exists(), quand je vois cela correctement.

Je ne l'ai pas essayé, mais à la lecture du code, je dirais que la valeur est vérifiée ici:

\Mage_Eav_Model_Entity_Abstract::_saveAttribute
if (!isset($this->_attributeValuesToSave[$table])) {
    $this->_attributeValuesToSave[$table] = array();
}

et parce que issetreturn false sur une clé de tableau définie qui est NULL, votre valeur est remplacée.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.