NG-повтор группирования с MySQL

У меня есть 2 таблицы в MySQL;

  • items
  • categories

items иметь cat_id столбец указывает на их категорию в categories Таблица

Я использую запрос ниже, чтобы получить предметы и категории;

SELECT a.id, a.cat_id, a.rest_id, a.name, a.description, a.price, b.rest_id, b.name
FROM items a, categories b
WHERE a.cat_id = b.id AND b.rest_id = 1

Я хочу использовать ng-repeat для создания списка, подобного приведенному ниже;

Category A

Item (belongs to cat A)
Item (belongs to cat A)
Item (belongs to cat A)

Category B

Item (belongs to cat B)
Item (belongs to cat B)
Item (belongs to cat B)

Как мне добиться этого с ng-repeat

У меня есть это до сих пор, но не работает;

<div class="results-group" ng-repeat="(key, value) in fetchedData">
<h3 style="text-align: left;"></h3>
<ul>
<li ng-repeat="data in value">
</li>
<ul>
</div>

Благодарю.


$query1 = "SELECT * FROM categories WHERE rest_id = $restaurant_id";
$select_all_cats = mysqli_query($connection, $query1);
$rows = $select_all_cats -> num_rows;

$arr1 = array();
$arr2 = array();
if($rows > 0) {
while($rows = mysqli_fetch_assoc($select_all_cats)) {
$arr1[] = $rows;
$cat_id = $rows['id'];

$query2 = "SELECT * FROM items WHERE cat_id = $cat_id";
$select_all_items = mysqli_query($connection, $query2);
$rowx = $select_all_items -> num_rows;
if($rowx > 0) {
while($rowx = mysqli_fetch_assoc($select_all_items)) {
$arr2[] = $rowx;
}
}
}
}

1

Решение

Во-первых, вы должны удалить вложенные запросы в PHP. Зацикленные / вложенные запросы — это анти-шаблон, который вы должны научиться распознавать и обычно заменять соответствующим запросом, использующим объединения.

Нечто подобное должно сработать на стороне PHP:

// array to store results
$item_array = array();
$query = "SELECT
cat.name AS cat_name,
i.id AS id,
i.name AS name,
i.description AS description,
i.price AS price
FROM categories AS cat
INNER JOIN items AS i
ON cat.id = i.id
WHERE i.rest_id = ?
ORDER BY cat_name ASC";

$result = mysqli_query($connection, $query);
if($result) {
while($row = mysqli_fetch_assoc($result)) {
// read into 2D array
$item_array[$row['cat_name']][] = $row;
}
}

Важно отметить, что здесь мы строим двумерный массив с именем категории, являющимся первым измерением. Затем вы можете использовать это с ng-repeat следующим образом. Обратите внимание, что я собираюсь ссылаться на данные в $item_array выше как itemData Вот. Также обратите внимание, что itemData, когда отформатирован для javascript будет принимать форму объекта. Каждый из категории «свойства» на itemData будет содержать численно индексированный массив записей элементов.

<div class="results-group" ng-repeat="(cat, items) in itemData">
<h3 style="text-align: left;">{{cat}}</h3>
<ul>
<li ng-repeat="item in items">
<!-- output content from item here like {{item.name}} and similar -->
</li>
<ul>
</div>
0

Другие решения

Других решений пока нет …