Я думаю, что, вероятно, здесь происходит то, что ваша попытка проверить, имеет ли продукт ключ badges
в коллекции атрибутов product.custom
, терпит неудачу. Это предотвращает выполнение обновления.
Я предлагаю удалить условие вокруг следующей строки: product.custom.badges = badges;
Если бы эта строка не была выполнена, то обновление базы данных никогда не произошло бы.
Настраиваемые атрибуты работают так, что они никогда не будут существовать, пока не будет установлено значение для этого атрибута для данного постоянного объекта. (например: Product). Таким образом, проверка, существует ли он, с помощью чего-то вроде: 'badges' in product.custom
(что является рекомендуемым способом) часто будет false
, даже если существует определение настраиваемого атрибута, потому что для многих продуктов никогда не было установлено значение значка. Как только объекту присвоено значение определенного настраиваемого атрибута, даже если он теперь установлен на null
, он будет существовать.
Кроме того, есть некоторые другие проблемы с кодом, которые могут вызывать проблемы. Один из примеров - определение переменной badges
дважды в одной и той же области. Другой пример - sni
, который помещается в конец строки, в которой вы определяете переменную products
. Вероятно, это вызывает ошибку в вашем коде. Наконец, рекомендуется по возможности избегать использования метода queryAllSiteProducts
. Альтернативой может быть использование ProductSearchModel
; Это может не всегда соответствовать вашим потребностям, но рекомендуется исключить его, прежде чем прибегать к queryAllSiteProducts
по соображениям производительности.
Еще нужно учитывать то, что если badges
в настоящее время имеет какие-либо выбранные значения, вы замените эти значения кодом, который у вас есть сегодня. Рассмотрите возможность установки badges
изначально на []
, затем проверьте, есть ли значение для этого продукта, выполнив:
if ('badges' in product.custom && !empty(product.custom.badges) {
badges = product.custom.badges;
}