Итерация по массиву PDO :: FETCH_GROUP для вывода результатов по категориям - PullRequest
0 голосов
/ 14 февраля 2020

Я уверен, что это очень простая проблема, и мне кажется, что я не могу разобраться. Я хочу отобразить список ссылок, сгруппированных на экране в соответствующие категории. Я использую bootstrap, и идея состоит в том, чтобы каждая категория ссылок выводилась в своем собственном столбце со ссылками под заголовком:

Например:

--- Cat 1 ------- Cat 2 ---

--- Ссылка 1 ------ Ссылка 3 ---

--- Ссылка 2 ------ Ссылка 4 ---

У меня есть две таблицы:

  • Первые «ссылки» имеют столбцы linkId, categoryId, linkTitle, linkDescription, linkUrl et c.
  • Вторые 'linkcategories' содержат столбцы categoryId, categoryTitle, categoryDescription et c.

. Я использую PDO и использую следующее для получить данные из базы данных:

public function getLinkCategories() {
  $this->db->query('SELECT categoryTitle, linkTitle, linkDescription, linkUrl 
                    FROM link 
                    INNER JOIN linkcategories ON linkCategories.categoryId = link.categoryId 
                    WHERE link.marked_for_delete != 1');
  $results = $this->db->resultSetGrouped();
  return $results;
}

Затем я использую приведенный ниже код для передачи результатов назад, в частности, я прочитал, что я должен использовать PDO :: FETCH_GROUP, чтобы я мог возвращать строки во вложенный массив где индексы будут уникальными значениями из первого столбца, а значения будут массивами, подобными тем, которые возвращаются регулярным fetchAll (). Таким образом, используя:

//get results set as array of objects - grouped
public function resultSetGrouped() {
  $this->execute();
  return $this->statement->fetchAll(PDO::FETCH_GROUP);
}

Моя страница загружена со следующим, и я передаю данные в представление:

public function index() {
  //get the links
  $links = $this->linkModel->getLinkCategories();
  $pageData = ['title' => 'Links • BM Intranet'];
  $data = ['pageData' => $pageData, 'linkCategories' => $links];
  $this->view('links/index', $data);
}

Я думаю, что я должен иметь возможность использовать foreach l oop отображать результаты на странице, но не могу придумать, как правильно назвать части. Это то, что возвращается в $ data.

Array
(
[pageData] => Array
    (
        [title] => Links • Intranet
    )

[linkCategories] => Array
    (
        [Unsorted] => Array //Unsorted is the category name
            (
                [0] => Array
                    (
                        [linkTitle] => a link title
                        [0] => a link title
                        [linkDescription] => This is an example of a link you can store. This is the external website
                        [1] => This is an example of a link you can store. This is the external website
                        [linkUrl] => https://www.asbcdef.co.uk/
                        [2] => https://www.abcdef.co.uk/
                    )

                [1] => Array
                    (
                        [linkTitle] => People
                        [0] => People
                        [linkDescription] => This is another link
                        [1] => This is another link
                        [linkUrl] => https://www.efgjk.co.uk/people/
                        [2] => https://www.efgjk.co.uk/people/
                    )

            )

    )

)

Итак, я застрял на части, возвращая приведенные выше результаты и отображая их на странице, как ...

- - Cat 1 ------- Cat 2 ---

--- Ссылка 1 ------ Ссылка 3 ---

--- Ссылка 2 ------ Ссылка 4 ---

У меня пока ...

foreach($data as $link) : ?>
<div class="col-lg-6 col-md-12 mb-5">
<div class="row">
  <div class="col lead border-bottom mb-2">
    <i class="fas fa-folder text-secondary"></i> <?php echo $link->linkCategories; ?>
  </div>
</div>
<div class="row">
  <div class="col">
    <a target="_blank" class="text-danger" href="<?php echo $category->url; ?>"><?php echo $category->linkTitle; ?></a>
    <span class="float-right text-secondary">Hits: <?php echo $category->hits; ?></span>
    <p mt-0>
      <?php echo $category->linkDescription; ?>
    </p>
  </div>
</div>

Но это не так работа с неверными свойствами.

Похоже, я могу использовать $ link [0] ['linkTitle'], чтобы получить данные из массива - так что я могу обдумать это. Что я не знаю, как это сделать сейчас, так это получить название категории (в данном случае это равно - Несортировано) и иметь ссылки, связанные с ним, под

1 Ответ

1 голос
/ 15 февраля 2020

Исходя из ваших текущих группировок данных, для итерации по группам и извлечения названий категорий вам потребуется реализовать три foreach($array as $index => $values) итерации.

$data = array(
    'pageData' => array(
        'title' => 'Links • Intranet',
    ),
    'linkCategories' => array(
        'Unsorted' => array(
            array(
                'linkTitle' => 'a link title',
                0 => 'a link title',
                'linkDescription' => 'This is an example of a link you can store. This is the external website',
                1 => 'This is an example of a link you can store. This is the external website',
                'linkUrl' => 'https://www.asbcdef.co.uk/',
                2 => 'https://www.abcdef.co.uk/',
            ),
            array(
              'linkTitle' => 'People',
                0 => 'People',
                'linkDescription' => 'This is another link',
                1 => 'This is another link',
                'linkUrl' => 'https://www.efgjk.co.uk/people/',
                2 => 'https://www.efgjk.co.uk/people/',
            ),
        ),
        'Cat 2' => array(
            array(
              'linkTitle' => 'People',
                0 => 'People',
                'linkDescription' => 'This is another link',
                1 => 'This is another link',
                'linkUrl' => 'https://www.efgjk.co.uk/people/',
                2 => 'https://www.efgjk.co.uk/people/',
            ),
        )
    ),
);

Простой Итерация https://3v4l.org/KGcuv

Поскольку я не знаю, как ожидается массив $data['pageData'] в желаемом выводе, я пропустил его итерацию, выполняя итерацию по linkCategories напрямую, используя $data['linkCategories'] , Я также добавил дополнительную группу Cat 2 для демонстрации нескольких группировок categoryTitle.

foreach ($data['linkCategories'] as $category => $links) {
    echo $category;
    foreach ($links as $link) {
        echo $link['linkTitle'];
    }
}

Результат

Unsorted
a link title
People

Cat 2
People

Bootstrap Итерация разметки https://3v4l.org/Du4YR

Для отображения каждой группы в виде отдельного столбца в bootstrap вам необходимо изменить простую итерацию с нужной разметкой, используя row и col-**-** классы на любой вкус. Для составления списка из двух столбцов я использовал col-6, но вы можете изменить размеры сетки по своему усмотрению.

<div class="row">
<?php foreach ($data['linkCategories'] as $category => $links) { ?>
    <div class="col-6">
    <div class="h6"><?php echo $category; ?></div>
    <?php foreach ($links as $link) { ?>
        <div class="row">
            <div class="col">
                <p>
                <a target="_blank" class="text-danger" href="<?php echo $link['linkUrl'] ?>"><?php echo $link['linkTitle']; ?></a>
                </p>
                 <p><?php echo $link['linkDescription']; ?></p>
             </div>
        </div>
    <?php } ?>
    </div>
<?php } ?>
</div>

Результат https://jsfiddle.net/sayudjp0/

<div class="row">
  <div class="col-6">
    <div class="h6">Unsorted</div>
    <div class="row">
      <div class="col">
        <p>
          <a target="_blank" class="text-danger" href="https://www.asbcdef.co.uk/">a link title</a>
        </p>
        <p>This is an example of a link you can store. This is the external website</p>
      </div>
    </div>
    <div class="row">
      <div class="col">
        <p>
          <a target="_blank" class="text-danger" href="https://www.efgjk.co.uk/people/">People</a>
        </p>
        <p>This is another link</p>
      </div>
    </div>
  </div>
  <div class="col-6">
    <div class="h6">Cat 2</div>
    <div class="row">
      <div class="col">
        <p>
          <a target="_blank" class="text-danger" href="https://www.efgjk.co.uk/people/">People</a>
        </p>
        <p>This is another link</p>
      </div>
    </div>
  </div>
</div>
...