Всякий раз, когда мне нужно сделать это, я использую что-то вроде:
Присоединение таблицы EAV (с атрибутами) к плоской таблице
Это не очень хорошо оптимизировано, но вы должны быть в состояниичтобы выбрать детали, которые вам нужны.
PS.
Я думаю, что я объясню, что я имею в виду под оптимизацией, так как это важно.В основе метода лежит этот бит:
->joinLeft(array($alias => $table),
'main_table.'.$mainTableForeignKey.' = '.$alias.'.entity_id and '.$alias.'.attribute_id = '.$attribute->getAttributeId(),
array($attribute->getAttributeCode() => $field)
);
Если вы знаете MySQL, вы будете знать, что при присоединении к таблице будет выбран только один индекс, чем конкретнее, тем лучше.В этом случае используются только поля entity_id
и attribute_id
, поэтому MySQL ограничен этими полями.Оба столбца индексируются, но количество элементов низкое.
Если условие также включает тип объекта, MySQL может выбрать IDX_BASE
, который индексирует столбцы entity_type_id,entity_id,attribute_id,store_id
в этом порядке (его необходимо обработать).их слева направо).Таким образом, что-то подобное приводит к значительному улучшению производительности EAV - в зависимости от того, сколько строк в «левой» таблице может быть в несколько сотен или тысяч раз лучше.
$alias.'.entity_type_id='.$entityType->getId().' AND main_table.'.$mainTableForeignKey.' = '.$alias.'.entity_id AND '.$alias.'.attribute_id = '.$attribute->getAttributeId().' AND '.$alias.'.store_id=0'