За последние 24 часа нас посетили 20305 программистов и 1010 роботов. Сейчас ищут 367 программистов ...

Категории и подкатегории

Тема в разделе "PHP для новичков", создана пользователем _ne_scaju_, 13 апр 2019.

  1. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    потому что практиковаться надо а не херней заниматься
    годик в каком нить движке покопаешься - многому научишься
    а бесконечные учебные задания нихрена не дадут
    за два с половиной года пора бы это уже понять
     
    #26 TeslaFeo, 14 апр 2019
    Последнее редактирование: 14 апр 2019
  2. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    в учебные материалы я уже давно не смотрю я по чуть чуть практикуюсь, да и в мануал заглядываю)
    делаю вот так запрос:
    PHP:
    1. SELECT `c`.`category_id`, `c`.`category_name`, `s`.`categ_id`, `s`.`subcategory_name`
    2. FROM `game_category` c
    3. LEFT JOIN `game_subcategories` s
    4. ON ( `c`.`category_id` = `s`.`categ_id` )
    5. WHERE `c`.`category_status` = 1
    6. ORDER BY `s`.`categ_id` ASC
    все данные выводятся хорошо в php_my_admin базе, но если я в левое меню массивом хочу перебрать категории, то в меню будут повторятся категории так как в категориях будет подкатегории, как в таком случае поступать?
    делать 2 запроса, один просто вытягивает категории, второй категория id попадает в подкатегорию?
     
    #27 _ne_scaju_, 14 апр 2019
    Последнее редактирование: 14 апр 2019
  3. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Ну хоть совет подкиньте не нужно писать вместо меня пока что :D
     
  4. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Ок повторюсь, как убрать повторяющие значения из меню?
    PHP:
    1. return $this -> db -> sel('
    2.            SELECT `c`.`category_id`, `c`.`category_name`, `s`.`categ_id`, `s`.`subcategory_name`
    3.            FROM `game_category` c
    4.            LEFT JOIN `game_subcategories` s
    5.            ON ( `c`.`category_id` = `s`.`categ_id` )
    6.            WHERE `c`.`category_status` = 1
    7.            ORDER BY `c`.`category_sort`, `s`.`categ_id` ASC');
    сделал запрос.
    PHP:
    1. $category = new CategoryGame();
    2. $listCategory = $category -> getCategoriesList();
    в контроллере вызвал.
    HTML:
    1. <?php foreach ( $listCategory as $ctg ): ?>
    2. <div class="list-group-item list-group-item-action category-group-title" data-target="#collapse<?php echo $ctg['category_id']; ?>" data-toggle="collapse">
    3. <h5><?php echo $ctg['category_name']; ?></h5>
    4. </div>
    5.  
    6. <div class="collapse" id="collapse<?php echo $ctg['categ_id']; ?>">
    7.      <a class="list-group-item list-group-item-action" href="/category/<?php echo $ctg['categ_id']; ?>"> { <?php echo $ctg['subcategory_name']; ?> }</a>
    8. </div>
    9. <?php endforeach; ?>
    в шаблоне вывел через массив, и после этого у меня дублируется категории, так как подкатегории для этих категорий несколько.
    Как можно придумать чтобы в меню выводилось по одной категории?
     
    #29 _ne_scaju_, 15 апр 2019
    Последнее редактирование: 15 апр 2019
  5. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @_ne_scaju_, самый простой вариант собрать всё в ассоциативный массив, одинаковые ключи перезапишутся.
     
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    более элегантней решения нет?)
     
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    да уж
    у меня не ключи повторяются а category_name - название категории, ключи все разные от 0 и до...
     
  8. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    select distinct
     
    _ne_scaju_ нравится это.
  9. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    ТС на таблицах key:value вообще умрет походу
     
  10. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    не понял тебя? Подробней)
    --- Добавлено ---
    попробую.
     
  11. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Код (Text):
    1.  
    2. table_keys | id | name
    3. table_key_values | key_id | value
    Не понимаю чем тебя не устраивает схема:
    table categories:
    id | parent_id | name
    1 0 Категория
    2 1 ПодКатегория
    2 1 ПодКатегория
    3 0 Категория
    4 3 ПодКатегория
    5 4 ПодПодКатегория
     
    _ne_scaju_ нравится это.
  12. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    может и устроило, но я сути не могу уловить)
    а теперь посидел три минуты подумал и вроде понял)
    типа:
    если будет 0 - это категория, если например 20 - это подкатегория и т.д. Ок а как я свяжу подкатегори с категориями? Допустим для категории 1 есть 5 подкатегорий а для категории 2 есть 3 подкатегории?
    Я не пойму если для категорий будет ключ 0 как же подкатегория поймет что имено этот ключ от ее категории?
     
  13. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @_ne_scaju_, пристрелить тебя мало :)
    разберись что такое id, а что такое parent_id и как они связаны
    ключа 0 нет ни у кого, он есть только в parent_id и это означает что это категория т.е. самый верхний уровень
     
    _ne_scaju_ нравится это.
  14. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Код (Text):
    1. select * from categories where parent_id = 0 # выбрать все категории
    2. select * from categories where parent_id = 2 # выбрать все категории у которых родительская категория равна id 2
    3. select * from categories where id = 2 or parent_id = 2 # выбрать родительскую категорию и все дочерии категории
     
    _ne_scaju_ нравится это.
  15. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    ай я забыл что ключ это первая ячейка, сейчас сижу через телефон)
    тогда я понял что мне предложили, буду использовать этот вариант, отпишусь когда сделаю, только это вечером будет :):D
     
  16. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Код (Text):
    1. INSERT INTO `game_category` (`category_id`, `parent_id`, `category_name`, `category_status`) VALUES
    2. (1, 0, 'WORLD OF TANKS', 1),
    3. (2, 0, 'WORLD OF WARSHIPS', 1),
    4. (4, 0, 'DOTA 2', 1),
    5. (6, 0, 'CSGO', 1),
    6. (7, 1, 'wot-1', 0),
    7. (8, 1, 'wot-2', 0),
    8. (12, 1, 'dota-1', 0),
    9. (13, 1, 'dota-2', 0),
    10. (14, 1, 'dota-3', 0),
    11. (15, 1, 'CS-1', 0),
    допустим создал таблицу вставил записи, вывожу записи.
    PHP:
    1. return $this -> db -> sel('SELECT `category_id`, `category_name` FROM `game_category` WHERE `parent_id` = 0 AND `category_status` = 1');
    запрос выводит все категории те у которых parent_id = 0 и статус равен = 1.
    а как же связать подкатегории с категорией?)
    подкатегорией считаю все id от 7 и до 15.
    пример, хочу чтобы wot-1 wot-2 входил в категории world of tanks, я в меню нажимаю на эту категории и после выводится эти подкатегории.
    и вообще объясните мне если подкатегория dota-1 и dota 2 и другие не касаются категории world of tanks то parent_id должен быть другой у dota-1-2 и других подкатегорий?
     
  17. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    аааааааааааааааа
    блин, это самая простая реализация, тут вообще думать не надо
    ну что сложного в parent_id подкатегории указать id родительской категории???
     
    _ne_scaju_ нравится это.
  18. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Код (Text):
    1. (1, 0, 'WORLD OF TANKS', 1),
    2. (2, 0, 'WORLD OF WARSHIPS', 1),
    3. (4, 0, 'DOTA 2', 1),
    4. (6, 0, 'CSGO', 1),
    5. (7, 1, 'wot-1', 0),
    6. (8, 1, 'wot-2', 0),
    7. (12, 1, 'dota-1', 0),
    8. (13, 1, 'dota-2', 0),
    9. (14, 1, 'dota-3', 0),
    10. (15, 1, 'CS-1', 0),
    допустим для world of tanks родительским будет 1, а для dota родительским будет 4 ?
    все дело в том что я такое меню не когда не делал, придумал захотел сделать, и проблемы появились, не могу сообразить мысли есть а воображение не работает.
     
    #43 _ne_scaju_, 17 апр 2019
    Последнее редактирование: 17 апр 2019
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    продолжаю дальше разбирать у меня голова пока не адаптировалась :D
    питаюсь вытащить это меню категории и подкатегории.
    Шаблон:
    HTML:
    1.  
    2. <div class="row">
    3.   <div class="col-lg-12">
    4.     <div class="list-group">
    5.       <?php foreach ( $listCategory as $key => $ctg ): ?>
    6.         <div class="list-group-item list-group-item-action category-group-title" data-target="#collapse<?php echo $ctg['category_id']; ?>" data-toggle="collapse">
    7.           <h5><?php echo $ctg['category_name']; ?></h5>
    8.         </div>
    9.  
    10.         <div class="collapse" id="collapse<?php echo $ctg['category_id']; ?>">
    11.           <a style="color: red;" class="list-group-item list-group-item-action" href="/category/<?php echo $ctg['category_id']; ?>">
    12.             { <?php echo $ctg['category_name']; ?> }
    13.           </a>
    14.         </div>
    15.       <?php endforeach; ?>
    16.     </div>
    17.   </div>
    18. </div>
    19.  
    Вызов в котроллере:
    PHP:
    1.     public function indexAction()
    2.     {
    3.         # Список категорий игровых для левого меню
    4.        $category = new CategoryGame();
    5.         $listCategory = $category -> getCategoriesList();
    6.  
    7.         # Список последних игр
    8.        $product = new UserProductGame();
    9.         $listGame = $product -> getLatestProducts(8);
    10.    
    11.         # Подключаем вид
    12.        require_once('app/views/main/index.php');
    13.         return true;
    14.     }
    Запрос в модели:
    PHP:
    1.     public function getCategoriesList()
    2.     {
    3.         return $this -> db -> sel('SELECT * FROM `game_category` WHERE `parent_id` = 0 AND `category_status` = 1');
    4.     }
    в итоге мы достали все категории меню, и через цикл перебрали, теперь догнать не могу а как же подкатегории вытащить?
    то-ли делать еще один запрос то ли можно из этого запроса вытащить данные?
    var_dump( $listCategory ) выводит только категории без подкатегорий.
     
  20. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Код (Text):
    1. (1, 0, 'WORLD OF TANKS', 1),
    2. (2, 0, 'WORLD OF WARSHIPS', 1),
    3. (4, 0, 'DOTA 2', 1),
    4. (6, 0, 'CSGO', 1),
    5. (7, 1, 'wot-1', 0),
    6. (8, 1, 'wot-2', 0),
    7. (12, 4, 'dota-1', 0),
    8. (13, 4, 'dota-2', 0),
    9. (14, 4, 'dota-3', 0),
    10. (15, 6, 'CS-1', 0),
     
  21. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    так я вчера задал вопрос правильно ли я думаю, про связь подкатегорий, так же само я вчера еще сделал, за направление спасибо)
    --- Добавлено ---
     
  22. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    короче получается так если я в моделе делаю запрос с указанием парент_ид=0 то выводится будет только категории, если я сделаю запрос без условия where то у меня будут все записи этой таблицы, и мне нужно будет через цикл перебрать данные чтобы они в меню были нужным образом, верно? Допустим если останеться как есть у меня в примере думаю не чего путевого не выйдет, нужно это дело по другому делать! Возможно цикл в цикле.
     
  23. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    лучше рекурсия
     
  24. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    сейчас смотрю как реализовывается рекурсия.
     
  25. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    почитал что это вообще такое рекурсия, это когда функция вызывает сама себя, и чем она мне поможет?)