У меня есть две таблицы базы данных с именами 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?
Это приведет к ненужному количеству запросов к серверу БД.
Самый простой подход:
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) . Как я могу присоединиться к этим двум запросам?
Вы можете использовать запрос, чтобы получить все записи 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 выдает ошибку неопределенной функции. Это пользовательская функция, которую я должен установить?
извините, теперь я добавил функцию к ответу выше, пожалуйста, проверьте.
Будьте осторожны с терминологией: то, что вы называете «базой данных», на самом деле является «таблицей» (или «таблицей базы данных», если вам нужно отличить от какого-либо другого значения «таблицы») — база данных — это то, что содержит все таблицы. . В этом случае из контекста понятно, что вы имеете в виду, но знание правильных терминов поможет избежать неправильного понимания людьми и поможет вам найти существующую информацию.