Как создать SQL-запрос для достижения необходимой задачи?

У меня есть следующая ситуация. У нас есть множество категорий продуктов, для которых в настройках отображения установлен один атрибут - display_mode - со значением "static block only" и другой атрибут - is_anchor - со значением "yes". 

Проблема в том, что при использовании плагина shopby от amasty на страницах категорий в заголовке добавляются атрибуты link rel="next" и link rel="prev", но link rel="next" отображается на фронте только для тех категорий, где display_mode установлен как "static block only" и is_anchor - "yes", при наличии дочерних категорий с продуктами.

Так как таких категорий очень много, вносить изменения вручную будет крайне утомительно. Я хочу узнать, возможно ли изменить все категории одновременно с помощью одного SQL-запроса, так как не совсем понимаю, как это сделать.

Например, <a href="https://meetanshi.com/blog/set-anchor-to-yes-in-all-categories-in-magento-2/" rel="nofollow">в этом источнике</a> есть пример, как установить значение is_anchor для всех категорий. В этом примере attribute_id для is_anchor равен 51.

Вот пример SQL-запросов: 
<pre><code class="sql">SELECT * FROM eav_attribute WHERE attribute_code = 'is_anchor';
UPDATE catalog_category_entity_int SET value = 0 WHERE attribute_id = 51;</code></pre>

Однако attribute_id для display_mode равен 49, и этот атрибут хранится не в таблице catalog_category_entity_int, а в catalog_category_entity_varchar. Значение, соответствующее "static block only" - PAGE.

Таким образом, я хотел бы составить запрос(запросы), который позволит мне получить все entity_id категорий, где attribute_id="49" имеет значение - value="PAGE" в таблице catalog_category_entity_varchar, и затем для этих entity_id установить значение - value="0" в таблице catalog_category_entity_int для соответствующего атрибута.
  • 14 апреля 2025 г. 10:05
Ответы на вопрос 2
Чтобы изменить значения атрибутов `is_anchor` для всех категорий, у которых `display_mode` установлен на "static block only", вам придется использовать два SQL-запроса. Один запрос будет выбирать все нужные `entity_id`, а второй будет обновлять значение `is_anchor` для этих категорий.

Вот пошаговое руководство:

1. Сначала вам нужно получить все `entity_id` категорий, где `display_mode` равно "static block only". Для этого выполните следующий запрос:

```sql
SELECT cce.entity_id 
FROM catalog_category_entity_varchar AS ccev
JOIN catalog_category_entity AS cce ON ccev.entity_id = cce.entity_id
WHERE ccev.attribute_id = 49 -- display_mode
AND ccev.value = 'PAGE';
```

2. Затем, используя полученные `entity_id`, вам нужно обновить значение атрибута `is_anchor` (если это значение равно 1 или `yes`), который хранится в таблице `catalog_category_entity_int`. Здесь мы будем устанавливать значение `is_anchor` на `0` для категорий, которые мы нашли на предыдущем шаге.

Используйте следующий запрос для обновления:

```sql
UPDATE catalog_category_entity_int 
SET value = 0 
WHERE attribute_id = 51 -- is_anchor 
AND entity_id IN (
    SELECT cce.entity_id 
    FROM catalog_category_entity_varchar AS ccev
    JOIN catalog_category_entity AS cce ON ccev.entity_id = cce.entity_id
    WHERE ccev.attribute_id = 49 -- display_mode
    AND ccev.value = 'PAGE'
);
```

Объединяя оба вышеуказанных шага, вы сможете установить значение атрибута `is_anchor` для всех категорий, которые имеют `display_mode` равным "static block only".

Пожалуйста, будьте осторожны при выполнении этих запросов, особенно на рабочей базе данных. Рекомендуется сначала протестировать их на резервной копии данных или в тестовом окружении.
UPDATE catalog_category_entity_int AS c 
  SET c.value = 0
  WHERE c.attribute_id = 51
    AND EXISTS(
      SELECT *
      FROM catalog_category_entity_varchar AS e
      WHERE e.entity_id = c.entity_id
        AND e.attribute_id = 49
        AND e.value = 'PAGE'
    )

Естественно, перед выполнением любых запросов на массовое изменение/удаление, не забудьте сделать бэкап базы.
Похожие вопросы