Раскрывающийся атрибуты продукта: int vs. varchar
-
16-10-2019 - |
Вопрос
Для атрибута, установленного как выпадающий список, это должно быть int
или varchar
?
Я устанавливаю каталог продуктов, в которые кто -то импортировал, и я вижу атрибут размера, созданный как раскрывающийся int
тип (backend
колонка в eav_attributes
), но целочисленные значения хранятся в catalog_product_entity_varchar
стол. Таким образом, простые продукты думают, что у них нет размеров.
Кроме того, я подумал, что если у таблицы Varchar EAV была раскрывающиеся значения, она сохранила ее как строку, а не целое число, которое указывает на таблицу EAV. Я видел выпадающий атрибут, хранящий его значения в ..._varchar
Таблица как фактические значения строк, а не число, которое обращалось к таблице атрибутов EAV, потому что она была создана как varchar
во время установки расширения.
Итак, мои вопросы ..
Выпадающий атрибут получает бэкэнд тип
int
Если создано в администраторе, но если вы создаете атрибут с помощью расширения, вы можете установить этот столбец какvarchar
. Анкет Имеет ли значение, если раскрывающийся атрибут являетсяint
илиvarchar
тип?Что касается каталога, который я исправляю, я не совсем уверен, что сделал оригинальный разработчик. Он не использовал текстовый файл для импорта продуктов; Из сценариев, которые у меня есть, использовались в импорте продукта, он программно сохранил продукты с данными (т.е.
$product->save()
) Но как этот раскрывающийся атрибут был создан какint
бэкэнд, но оказался вcatalog_product_entity_varchar
таблица с численными строками, которые указывают наeav_attribute_option
. Анкет Я проверил эти значения "varchar" указывают на фактические записи вeav_attribute_option
.Если раскрывающийся атрибут был настроен как
varchar
Бэкэнд тип, как Magento знает, чтобы ссылаться на параметры EAV с численными значениями варчара вместо того, чтобы просто назначать значение атрибута как «1» или «2» (как в размере 1, 2 и т. Д. Вместо небольшого, среднего и т. Д. .)? Я предполагаю, что это потому, что он был настроен как выпадающий, но просто хотел проверить.
Решение
Давайте возьмем их один за другим.
Вы должны использовать
int
значения для последовательности. Но (как вы видели) это работает сvarchar
также. У меня есть догадка, с которой он работаетtext
слишком.«Как этот выпадающий атрибут был создан как бэкэнд Int, но оказался в Catalog_product_entity_varchar». Это полная загадка. Только первоначальный разработчик может сказать вам это (возможно, даже не он). Но я могу сказать вам, как возможно ссылаться на
eav_attribute_option
стол. Это потому, что параметры атрибутов не заботятся о типе атрибута. Если атрибут имеетsource_model
это вызываетgetAllOptions
Из этой модели источника и соответствует значению, установленному на продукт с тем, что он находит в результатеgetAllOptions
.Я думаю, что ответ на номер 2 также ответит на номер 3. Кроме того, это потому, что PHP является языком программирования свободного типа и
3 == "3"
оцениваетtrue
.
Другие советы
В дополнение к ответу Мариуса - я не уверен в этом на 100% - я думаю, что если вы программно создаете выпадающий атрибут как тип varchar
и добавить параметры, но позже вы сохраняете атрибут через Admin (Catalog -> Атрибуты -> Управление атрибутами), он изменяет тип из varchar
к int
. Анкет Таким образом, вы получите атрибут с типом int
, но с его ценностями, фактически хранящимися в catalog_product_entity_varchar
стол.
Странным побочным эффектом этого является то, что некоторые вещи продолжают работать нормально, но как только вы это сделаете addAttributeToFilter
, это больше не даст вам никаких результатов.
РЕДАКТИРОВАТЬ: Я только что проверил это, и это как я описал выше. Если вы сохраните атрибут с input
в качестве select
Через администратор это изменит type
к int
, даже если это было varchar
до. По какой -то причине все этикетки/параметры все еще работают, но фильтрация перестает работать, потому что она смотрит не в неправильной таблице для значений.
Я столкнулся с той же проблемой с пользовательским модулем импорта. Атрибуты были созданы с выпадающим и бэкэнд типом 'varchar'. Продукты были настроены отлично в бэкэнде, но не отображались на фронтальных категориях.
Это сработало только тогда, когда мы переехали импорт, а атрибуты имеют бэкэнд типа «int». Теперь продукты отображаются нормально, а значения атрибутов отображаются в таблице '_int'.