Как собрать коллекцию продуктов без использования HASH? Есть решение
Привидите пожалуйста пример, как корректно по SQL запросу собрать коллекцию, без использования hash?
Эта тема в архиве. Добавление комментариев к ней отключено.
Привидите пожалуйста пример, как корректно по SQL запросу собрать коллекцию, без использования hash?
Эта тема в архиве. Добавление комментариев к ней отключено.
6 ответов
Слишком общий вопрос.
$model = new waModel(); $data = $model->query("SELECT * FROM shop_product WHERE 1")->fetchAll(); wa_print_r($data);Отчего такое ограничение?
Мне нужно было найти товар по SKU, затем выбрать все продукты по тегам в нем и все это поместить в коллекцию, с применением filters и setCollection метода. Разобрался, просто для меня не очень понятно, что происходит, если конструктору класса shopProductsCollection передать пустой hash.
Оказалось все просто, если hash пустой, то ожидаются конструкции SQL запроса.
$products = new shopProductsCollection();
$products->addJoin($table, $on = null, $where = null)
и любые другие условия,
затем можно применить фильтры $products->filters($data)
И сборка-вывод $this->setCollection($products)
А чего бы не воспользоваться кастомной коллекцией через плагин?
Для примера почти то же, только выводит товары по тегам оригинальных ID товаров.
public function productsCollection(&$params) { /** * @var shopProductsCollection $collection */ $collection = $params['collection']; if($collection instanceof shopProductsCollection) { $hash = $collection->getHash(); if (count($hash) == 2 && $hash[0] == 'tagnav') { $pids = array_filter(explode(',', $hash[1]), 'is_numeric'); if (!$pids) { $collection->addWhere('0'); return true; } $product_tags_model = new shopProductTagsModel(); $tag_ids = $product_tags_model ->select('DISTINCT tag_id') ->where('product_id IN(?)', array($pids)) ->fetchAll(null, true); if ($tag_ids) { $tag_ids = implode(',', $tag_ids); $collection->addJoin('shop_product_tags', 'p.id = :table.product_id', ':table.tag_id IN (' . $tag_ids . ')'); $collection->addWhere('p.id NOT IN('.implode(',',$pids).')'); return true; } else { $collection->addWhere('0'); return true; } } } return false; }Использовать new shopProductsCollection('tagnav/1,2,3') или {$wa->shop->products('tagnav/1,2,3')}
Получилось. Спасибо за пример. Действительно, лучше таким образом реализовать.