Хелпер не помогает обойти 20000 товаров, какие еще есть варианты? Есть решение
Что захотел - получить на главной выборку в количестве 10 из ВСЕХ товаров с фильтрацией по заполненности определенной характеристики и по её величине.
Добавил хелпер:
class shopMyCustom extends waAppViewHelper { public static function hGetProductFeatureValueByCode($product_id, $feature_code) { $features=new shopProductFeaturesModel(); $vals=$features->getValues($product_id); return $vals[$feature_code]; } }
Вывожу на главной, добавляя условие на заполненность характеристики и на величину (характеристика заполнена у 3000 товаров и фильтруя по величине, получается всего 500 товаров):
{$products = $wa->shop->products(null,null,20000)} {foreach $products as $p} {$discont=shopMyCustom::hGetProductFeatureValueByCode($p.id,'discont')} {if $discont > 0 && $discont < 8} {$p.name} - {$discont} {/if} {/foreach}
Надеялся что работа через хелпер поможет, ан нет, на 20000 товарах вывод ОДНОЙ характеристики обваливает сайт. Как еще выцепить эти товары, при том, что нужно показать всего 10-20??
40 ответов
Ищите другое решение или раз в сутки делайте индексацию, временную таблицу и из нее выводите.
Тут поможет сложный sql запрос! примерно из 6 таблиц))))
который вообще нахрен повесит бд
хотите скорости - создавайте свою индексную таблицу
а разве не из трех таблиц? характеристика известна и будет всегда одна и та же, да еще и текстовое поле. неужели повесит? я так понял, что в данном случае вешается фронт??? или нет?
На хостцмс по 50к товаров легко база шуршала, как раз именно тоже самое делала... там таблица товаров+таблица характеристик+таблица связей...
здесь больше таблиц. у вэбасиста сложная структура характеристик
можно, конечно, статикой по вставлять некоторые данные в запросы, но все же - лучше и логичней как я описал.
раз уж Вы лезете в индивидуальные запросы к БД - чего не сделаете как я говорю?
Исходя из логики требуемого, подошел бы модуль или плагин типа "Товары 2001 г. выпуска" или например "Товары со скидкой" (у меня как раз скидка сделана текстовой характеристикой), но почему-то штатного нет, а список товаров с фильтром по характеристике в моей версии сделать низзя, говорят в семерке есть это. И как же там интересно это делается?
плагины ресурсы тоже нехило кушают в больших магазинах!
Вечером напишу запрос тебе!
я весь в интриге!! жду...
Опишите подробнее по каким признакам выбирать продукты! Так то там есть таблица в которой есть уже все данные для выборки по значению характеристики продуктов!
по каким по каким - у которых ЗАПОЛНЕНА характеристика и у которых она в интервале, например от 0 до 8. харакетристика - текстовое поле.
А если плясать от значения характеристики то не повесит бд!
Если использовать мозг, то тут поможет посмотреть класс shopProductsCollection, а не возведение своего огорода
О
83 - это что? походу еще надо табличку присоединить.
наверное, все вносимые значения еще храняться в другой табличке, не могу посмотреть, т.е. если такая скидка уже вбивалась в это поле , то у нее уже есть АЙДИ. мда уж.. логика... АЙДИ для ЗНАЧЕНИЙ характеристик плюс свзяь с еще однйо таблицей. точно 6 таблиц как тут ктото говорил
-
мне кажется, ORDER BY надо делать по product_id, т.к. провел эксперимент - сохраняю товар с новым, ранее не примененным ЗНАЧЕНИЕМ характеристики - в таблице shop_product_features создается новая строка... карл?
т.е. если предположить гипотетику что оператор откроет товар и начнет менять одну характеристику и сохранять и так 1000 раз, то указанная выше таблица вырастет на 1000 строк!!!!
на практике конечно не так печально, вбил характеристику и они по идее дальше постоянны, но вот в моем случае скидка на товар сделана как характеристика, а скидка имеет право меняться..
и SELECT сделать не как *, а как SELECT product_id - нужно из жалкой таблицы только айди товара, больше оттуда ничего не вытянуть)))
почему-то урл не могу вытянуть...
используй класс shopProduct($product_id) там все данные по товару грузятся
я даже не сомневался, что прямой запрос в базу экономенее на несколько порядков! ибо дергать готовые массивы, отталкиваясь от систменых переменных и потом их же копошить опять же штатными обработками как видно привело к банальной классике!!! Гена Рыжов = ГЕНИЙ!
ибо все ORM говно и жрут память, а ресурс запроса не весит ничего, пока из него не пишешь массив!
Советую попробовать:
$col = new shopProductsCollection();
$col->filters(array($feature['code'] => $feature_value['id']));
$products = $col->getProducts("*", 0,10);
Вдруг отработает!
Вот как на на моделях такой запрос составить?
Ннужно внутри цикла с перебором всех товаров добавить еще цикл с перебором характеристик по каждому товару с обязательным запросом в базу на каждую характеристику. Это должно помочь, да и модераторам нравится.
Жестокий ты какой :) Ну, пусть будет пятничный тредик
Дыг все сделано уже, через ПРАВИЛЬНЫЙ хелпер ОДИН запрос в базу и вывод 10 товаров со скидкой. девиз - долой ORM помог и решил этот день!
Вроде что-то похожее видел в WA-маркетплейсе, что-то там с чем-то по поводу характеристик??? Ну щас выложу код, немного обвалим цены как говорится... Небольшая черная пятница для продаванов, как вам?)))
Ага. Посты на форуме очень сильно влияют на продажи :)
Трепещите, разработчики!!!! ]:->
ржу нимагу
ну все, Паша, держись, вот код, это конец продаж, все!!!!
хелперов нет и не будет, но вы там держитесь и всего вам хорошего!
как их задело слово ОДИН запрос в базу))))
Один запрос в базу запрещен правилами Webasyst. Это путь к ORM, а это не приветствуется.
Можно сделать так:
Сделай через модель и все будут довольны https://support.webasyst.ru/13989/khelper-ne-pomog...
так и сделал
Кстати, всегда хотел спросить какой тип данных в mysql отвечает за
Я грешным делом всегда применяю tinyint и пользуюсь 0 и 1. Да и в вебасистовских таблицах ни разу не встречал boolean
зачем вам это знание? у вас лучше получается шутить...
Ну я подшучу над кем-нибудь. Напишу что-то типа WHERE p.active = b:active :)
В MYSQL нет типа boolean! А Вебасист назвал чтобы не путать прогеров!
Ну ORM-то нет в WA-фреймворке. Но адаптер бд, по идее, должен смаппить это на int 1/0
то есть заведи, например, поле active INT(1) default=0 и попробуй использовать ->where('acive=b:active', array('active'=>true))
В крутой кабак заходит мужик и говорит бармену:
— Мне 100 грамм водки.
Бармен наливает, подает. Мужик достает из кармана мензурку и удостоверение:
— Контрольная закупка. 75 грамм! Штраф $50.
Следующий вечер. Те же лица. Мужик снова измеряет мензуркой и снимает полтинник штрафа. Потом спрашивает бармена:
— Слушай, ты же меня узнал, почему все равно недолил?
— Да мне проще полтинник отдать, чем руку сбивать из-за тебя...