Проблема с созданием отношений родитель-потомок между двумя таблицами базы данных с помощью php codeigniter

У меня есть две таблицы базы данных с именами article_category и article_case. Предполагается, что они должны быть объединены на веб-странице, как показано ниже:

Категория статьи[название]
Категория статьи[описание]
Случай со статьей[название]
Дело о статье[содержание]
Случай со статьей[название]
Дело о статье[содержание]

Это должно повторяться с использованием foreach, пока все категории статей не будут заполнены на странице.
Каждый article_case также будет использовать foreach, но он должен учитывать свое значение «category_id», которое соответствует «id» в article_category.

У меня возникли проблемы с фильтрацией таблицы article_case, чтобы она выбирала только строки из своего родительского 'category_id'.

Это мой текущий php-код (который создает только массив каждой таблицы):

$this->db->select( "id,title,description" );
$this->db->from( 'article_category' );
$query_article_category = $this->db->get_compiled_select();

$query = $this->db->query( $query_sustainability_category . 'ORDER BY sort ASC ' );
foreach ($query->result_array() as $val) {
        $data['article_category_posts'][$val['id']] = $val;}

$this->db->select( "id,category_id,title,contents" );
$this->db->from( 'article_case' );
$query_article_case = $this->db->get_compiled_select();

$query = $this->db->query( $query_article_case);
$data[ 'article_cases' ] = $query->result_array();

И вот мой html:

    <?php foreach ($article_category_posts as $key => $val) { ?>
<section>
   <h2><?php echo $val['title']; ?></h2>
   <p><?php echo $val['description']; ?></p>
</section>
<?php foreach ($article_cases as $key => $val) { ?>
<section>
   <h3><?php echo $val['title']; ?></h3>
   <p><?php echo $val['contents']; ?></p>
</section>
<?php } ?>
<?php } ?>

Текущая настройка будет вводить все article_cases независимо от category_id. Как я могу использовать foreach при назначении каждой статьи article_case соответствующей статье article_cateogry?

Будьте осторожны с терминологией: то, что вы называете «базой данных», на самом деле является «таблицей» (или «таблицей базы данных», если вам нужно отличить от какого-либо другого значения «таблицы») — база данных — это то, что содержит все таблицы. . В этом случае из контекста понятно, что вы имеете в виду, но знание правильных терминов поможет избежать неправильного понимания людьми и поможет вам найти существующую информацию.

IMSoP 10.02.2023 12:10
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
74
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это приведет к ненужному количеству запросов к серверу БД.

Самый простой подход:

  • выберите все категории (как у вас) SELECT * FORM a_category
  • для каждой категории выберите кейсы SELECT * FROM a_case WHERE category_id = {$category['id']}

Второй — объединить категории и кейсы прямо в запросе с помощью join и скорректировать полученные данные в php:

SELECT cat.title, cat.description, case.id AS case_id, case.category_id, case.title, case.content
FROM a_case case
INNER JOIN a_category cat ON cat.id = case.category_id

Спасибо! Однако у меня проблемы с присоединением к столам. В моем коде INNER JOIN объединяет исходные таблицы без атрибутов WHERE. Как выбрать отфильтрованные результаты и соединить их? Я создал два запроса: один из результатов SELECT * FORM a_category ($query1) и один из SELECT * FROM a_case WHERE category_id = {$category['id']} ($query2) . Как я могу присоединиться к этим двум запросам?

Toru Kawahata 11.02.2023 05:20
Ответ принят как подходящий
  • Вы можете использовать запрос, чтобы получить все записи article_case со связанными article_category.

  • сгруппируйте результат запроса по category_id.

     $this->db->select("cat.title,cat.description,case.category_id, 
      case.title AS case_title, case.contents" );
     $this->db->from( 'article_category cat');
     $this->db->join('article_case case','case.category_id=cat.id');
     $result=$this->db->get()->result_array();
    
     $result_group = array_group_by($result, 'category_id');
    
  • группировка массива по функции

     function array_group_by(array $array, $key)
     {
         if (!is_string($key) && !is_int($key) && !is_float($key) && !is_callable($key)) {
             trigger_error('array_group_by(): The key should be a string, an integer, or a callback', E_USER_ERROR);
    
             return NULL;
         }
         $func = (is_callable($key) ? $key : NULL);
         $_key = $key;
         // Load the new array, splitting by the target key
         $grouped = [];
         foreach ($array as $value) {
             if (is_callable($func)) {
                 $key = call_user_func($func, $value);
             } elseif (is_object($value) && isset($value->{$_key})) {
                 $key = $value->{$_key};
             } elseif (isset($value[$_key])) {
                 $key = $value[$_key];
             } else {
                 continue;
             }
             $grouped[$key][] = $value;
         }
         // Recursively build a nested grouping if more parameters are supplied
         // Each grouped array value is grouped according to the next sequential key
         if (func_num_args() > 2) {
             $args = func_get_args();
             foreach ($grouped as $key => $value) {
                 $params = array_merge([$value], array_slice($args, 2, func_num_args()));
                 $grouped[$key] = call_user_func_array('array_group_by', $params);
             }
         }
    
         return $grouped;
     }
    
  • в представлении вы можете показать, как показано ниже

     <?php foreach ($result_group as $key => $cat_result) { ?>
       <section>
         <h2><?php echo $cat_result[0]['title']; ?></h2>
         <p><?php echo $cat_result[0]['description']; ?></p>
         <div class = "box-bd-doted">
       </section>
       <?php foreach ($cat_result as $key => $val) { ?>
         <section>
           <h3 style = "color:red"><?php echo $val['case_title']; ?></h3>
           <p><?php echo $val['contents']; ?></p>
         </section>
       <?php } 
     }
     ?>
    

array_group_by выдает ошибку неопределенной функции. Это пользовательская функция, которую я должен установить?

Toru Kawahata 13.02.2023 01:23

извините, теперь я добавил функцию к ответу выше, пожалуйста, проверьте.

N.Nush 13.02.2023 06:06

Другие вопросы по теме