Pepperok Опубликовано 30 января, 2014 Жалоба Поделиться Опубликовано 30 января, 2014 Добрый день, подскажите пожалуйста проблема в следующем. У меня в категории находиться около 30 товаров. Я хочу вывести блок похожих (связанных) товаров и мне приходиться в каждом товаре вбивать около 10-ти штук которые относятся к нему, и тоже самое делать в тех 10-ти. Вопрос, как автоматизировать данную процедуру, например вбив связь в одном только товаре, а в других оно подтягивало автоматически. Заранее спасибо за ответы. Цитата Ссылка на сообщение Поделиться на другие сайты
mart Опубликовано 30 января, 2014 Жалоба Поделиться Опубликовано 30 января, 2014 Самый просто способ - дублировать обратную связь для связанных товаров. В файле api/Products.php заменить метод add_related_product на public function add_related_product($product_id, $related_id, $position=0) { $query = $this->db->placehold("INSERT IGNORE INTO __related_products SET related_id=?, product_id=?, position=?", $product_id, $related_id, $position); $this->db->query($query); $query = $this->db->placehold("INSERT IGNORE INTO __related_products SET product_id=?, related_id=?, position=?", $product_id, $related_id, $position); $this->db->query($query); return $related_id; } Т.е. мы создаем обратную связь. Ну и естественно аналогичным образом модернизируем удаление - метод delete_related_product public function delete_related_product($product_id, $related_id) { $query = $this->db->placehold("DELETE FROM __related_products WHERE related_id=? AND product_id=? LIMIT 1", intval($product_id), intval($related_id)); $this->db->query($query); $query = $this->db->placehold("DELETE FROM __related_products WHERE product_id=? AND related_id=? LIMIT 1", intval($product_id), intval($related_id)); $this->db->query($query); } Теперь при установке связи в 1 товаре - он будет появляться и в другом, и аналогично в обратном порядке.P.S. Предчувствуя критику некоторый персон - да можно конечно растянуть задачу на несколько человекочасов и кучу денег, но обратные связи по ключам работают быстро и эффективно... Цитата Ссылка на сообщение Поделиться на другие сайты
rostislav505 Опубликовано 30 января, 2014 Жалоба Поделиться Опубликовано 30 января, 2014 mart, а почему бы просто в отображении не сделать поиск по product_id и related_id что бы не дублировать записи в БД То есть в методе get_related_products $product_id_filter = $this->db->placehold('AND product_id in(?@)', (array)$product_id); заменить на $product_id_filter = $this->db->placehold('AND (product_id in(?@) OR related_id in(?@))', (array)$product_id, (array)$product_id); Цитата Ссылка на сообщение Поделиться на другие сайты
mart Опубликовано 30 января, 2014 Жалоба Поделиться Опубликовано 30 января, 2014 Я понимаю Ваше решение, rostislav505, тоже была такая первая такая мысль, но смысл в том, что при выводе в товаре связанных будет выдавать в том числе и тот, из которого вызывают. Цитата Ссылка на сообщение Поделиться на другие сайты
rostislav505 Опубликовано 30 января, 2014 Жалоба Поделиться Опубликовано 30 января, 2014 можно добавить еще одно условия в запрос, исключающие такие строки. но все-же согласен, -это пошли костыли.. Цитата Ссылка на сообщение Поделиться на другие сайты
kislotnik Опубликовано 17 августа, 2020 Жалоба Поделиться Опубликовано 17 августа, 2020 Самый просто способ - дублировать обратную связь для связанных товаров. В файле api/Products.php заменить метод add_related_product на public function add_related_product($product_id, $related_id, $position=0) { $query = $this->db->placehold("INSERT IGNORE INTO __related_products SET related_id=?, product_id=?, position=?", $product_id, $related_id, $position); $this->db->query($query); $query = $this->db->placehold("INSERT IGNORE INTO __related_products SET product_id=?, related_id=?, position=?", $product_id, $related_id, $position); $this->db->query($query); return $related_id; } Т.е. мы создаем обратную связь. Ну и естественно аналогичным образом модернизируем удаление - метод delete_related_product public function delete_related_product($product_id, $related_id) { $query = $this->db->placehold("DELETE FROM __related_products WHERE related_id=? AND product_id=? LIMIT 1", intval($product_id), intval($related_id)); $this->db->query($query); $query = $this->db->placehold("DELETE FROM __related_products WHERE product_id=? AND related_id=? LIMIT 1", intval($product_id), intval($related_id)); $this->db->query($query); } Теперь при установке связи в 1 товаре - он будет появляться и в другом, и аналогично в обратном порядке.P.S. Предчувствуя критику некоторый персон - да можно конечно растянуть задачу на несколько человекочасов и кучу денег, но обратные связи по ключам работают быстро и эффективно...подскажите почему может не работать? 100% сделано как вы написали Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.