Пытаюсь добавить в карточку товара вывод аналогов каталожных номеров, сделал в базе таблицу аналогов написал запрос к БД, в консоли phpmayadmin проверял все работает как нужно, но не получается сделать вывод в карточку товара. в моделе сделал запрос к БД public function getProductCross($product_id) { $query = $this->db->query("SELECT copy_number FROM oc_product JOIN oc_my_cross ON model = orig_number WHERE model = '7701477028'"); return $query->rows; в контроллере $data['cross_list'] = $this->model_catalog_product->getProductCross($product_id); в tpl делаю так <?php if ($cross_list) { ?> <?php foreach ($cross_list as $cros_name) { ?> <li><?php echo $cros_name['name']; ?></li> <?php } ?> <?php } ?> на сайте получаю ошибку Notice: Undefined index: name in..... не могу сообразить что поправить в tpl
PHP: public function getProductCross($product_id) { $query = $this->db->query("SELECT mc.copy_number as name FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "my_cross mc ON (p.model = mc.orig_number) WHERE p.product_id = '".(int)$product_id."'"); if ($query->num_rows) { return $query->row; } else { return ''; } }
Спасибо, INNER JOIN то же работает, по крайней мере в mysql, LEFT JOIN показывают одинаковый результат. Возможно LEFT JOIN будет более уместным, но я когда разбирался в этом пришел к выводу что INNER JOIN нужен. Не могли бы прояснить, . DB_PREFIX . для чего, в сети так и не нашел что это и с чем его едят)). Еще вопрос (int)$product_id, я так понимаю это id продукта в котором мы находимся приведенный к числовому значению? У меня сравнение в таблицах идет не по id а по модели, применимо ли это для такого? Мне ведь нужно выводить аналог по модели а не по product_id, в моделе каталожный номер детали. В таком виде выдает ошибку: Warning: Illegal string offset 'name' in....
@Baco в данном случае нужен JOIN (inner join) Т.е. получить полное соответствие Все эти картинки просто запутывают и не дают полного понимания соеденений меняем на Код: public function getProductCross($product_id) { $query = $this->db->query("SELECT mc.copy_number as name FROM " . DB_PREFIX . "my_cross mc LEFT JOIN " . DB_PREFIX . "product p ON (p.model = mc.orig_number) WHERE p.product_id = '".(int)$product_id."'"); return $query->rows; } И тогда мы получим кортеж из соответствующих моделей/номеров из my_cross Тогда это должно работать Код: <?php if ($cross_list) { ?> <?php foreach ($cross_list as $cros_name) { ?> <li><?php echo $cros_name['name']; ?></li> <?php } ?> <?php } ?>
Спасибо, все работает так как задумано. Далее думаю как лучше подтянуть товары по этим номерам в карточку товара
Посоветуйте, как лучше реализовать следующее, после получения аналога товара в карточке товара, эти номера сделать ссылками на товар, тогда получится дополнительная ссылка внутри магазина, это вроди не совсем хорошо, или делать дополнительный запрос к БД на основании полученного результата выводить конкретный товар который соответствует номеру аналога и в карточку выводить уже товар, по типу рекомендуемых товаров, т.е. открыли карточку товара и в ней ниже аналоги товаров.
Хочу из БД с помощью запроса вытянуть product_id на основании полученного номера аналога из предыдущего запроса, что б потом на основании product_id вывести товар. Составил запрос к БД с подзапросом такого вида: SELECT model, product_id FROM oc_product WHERE model = ANY (SELECT copy_number FROM oc_product JOIN oc_my_cross ON model = orig_number WHERE model = '7701477028') в mysql при вводе в консоль работает отлично оформляю его в файле: public function getProductCross($product_id) { $query = $this->db->query("SELECT p.product_id FROM" . DB_PREFIX . "oc_product op WHERE p.model = ANY"("SELECT mc.copy_number as name FROM " . DB_PREFIX . "my_cross mc LEFT JOIN " . DB_PREFIX . "product p ON (p.model = mc.orig_number) WHERE p.product_id = '".(int)$product_id."'")); return $query->rows; } выдает ошибку синтаксическую Parse error: syntax error, unexpected '(' in /... скобка не нравится, пробовал убирать, тогда то же лезет ошибка, подскажите как правильно оформить
Разобрался уже, public function getProductCross($product_id) { $query = $this->db->query("SELECT p.product_id FROM " . DB_PREFIX . "product p WHERE p.model = ANY (SELECT mc.copy_number as name FROM " . DB_PREFIX . "my_cross mc LEFT JOIN " . DB_PREFIX . "product p ON (p.model = mc.orig_number) WHERE p.product_id = '".(int)$product_id."')"); return $query->rows; } так работает
если делать по аналогии с похожими товарами, т.е. что б отображались фото товара, модель, производитель, цена и название, нужно в запросе добавить еще вывод этих полей. получится вот так: public function getProductCross($product_id) { $query = $this->db->query("SELECT p.product_id, p.image, p.price, p.model, (SELECT md.name FROM " . DB_PREFIX . "manufacturer_description md WHERE md.manufacturer_id = p.manufacturer_id AND md.language_id = '" . (int)$this->config->get('config_language_id') . "') AS manufacturer, (SELECT pd.name FROM " . DB_PREFIX . "product_description pd WHERE pd.product_id = p.product_id ) AS name FROM " . DB_PREFIX . "product p WHERE p.model = ANY (SELECT mc.copy_number as name FROM " . DB_PREFIX . "my_cross mc LEFT JOIN " . DB_PREFIX . "product p ON (p.model = mc.orig_number) WHERE p.product_id = '".(int)$product_id."')"); return $query->rows; }