Перейти к содержанию
Prior

поиск товара по n-фильтрам одновременно

Рекомендуемые сообщения

мне надо найти товар который 100% имеет в связях 2 конкретных фильтра
напрмер товар авто
фильтр красный (filter_id =7)
фильтр пикап (filter_id = 25)

поиск товаров происходит в \catalog\model\catalog\product.php
public function getProducts($data = array()) {
...
$sql .= " AND pf.filter_id IN (" . implode(',', $implode) . ")";
тоесть с моими данными это
$sql .= " AND pf.filter_id IN (7,25)";

оно мне выдает все красные и все пикапы
мне ненадо все а только красные пикапы

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как всегда сам додумал
но если кому надо будет то сделал
<file path="catalog/model/catalog/product.php">
<operation>
            <search><![CDATA[
                $filters = explode(',', $data['filter_filter']);
            ]]></search>
            <add position="replase" offset="6"><![CDATA[    
                $filters = explode(',', $data['filter_filter']);
                if (count($filters)<2) {$sql .= " AND pf.filter_id = $filters[0] ";} else {
                $sql .= " AND p.product_id in (SELECT product_id FROM " . DB_PREFIX . "product_filter WHERE filter_id = '". $filters[0] ."'";
                for ($i=1; $i<count($filters); $i++)
                    {$sql .= " AND product_id IN (SELECT product_id FROM " . DB_PREFIX . "product_filter WHERE filter_id = '".$filters[$i]."' ) ";}
                $sql .= ')';
                }
            ]]></add>
        </operation>
        
        <operation>
            <search><![CDATA[
                if (!empty($data['filter_name']) || !empty($data['filter_tag'])) {
            ]]></search>
            <add position="before" offset ="2"><![CDATA[    
                } else {
                    if (!empty($data['filter_filter'])) {
                        $implode = array();
                        $filters = explode(',', $data['filter_filter']);
                        if (count($filters)<2) {
                            $sql .= " AND pf.filter_id = $filters[0] ";
                        } else {
                            $sql .= " AND p.product_id in (SELECT product_id FROM " . DB_PREFIX . "product_filter WHERE filter_id = '". $filters[0] ."'";
                            for ($i=1; $i<count($filters); $i++) {
                                $sql .= " AND product_id IN (SELECT product_id FROM " . DB_PREFIX . "product_filter WHERE filter_id = '".$filters[$i]."' ) ";
                            }
                            $sql .= ')';
                        }
                    }
            ]]></add>
        </operation>
</file>
думаю если кому надо будет тот разберет код

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

скорость заодно замерьте. эдак на 1000 товаров

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у меня нет 1000 товаров
но если у вас есть какието замечания
то я с радостью возьму их во внимания
сразу скажу я не спец по бд поэтому сделал как сумел )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.