Как отобразить сгруппированные данные из рекурсивного SQL-запроса в HTML-таблице Twig? - PullRequest
0 голосов
/ 27 марта 2019

Я хочу иметь возможность отображать данные из базы данных SQL (используя PDO) и представлять их в виде таблицы HTML, однако у меня возникают проблемы с пониманием того, как включить подзапрос в результаты моего исходного запроса.Я приблизился к желаемому результату, используя функцию GROUP_CONCAT для группировки данных в виде значений, разделенных запятыми.

Использование Twig для заполнения таблицы HTML требуемыми значениями, но я не могу понять, как сгруппировать определенные значения (названия курсов) под студентом.

`PHP
SELECT classes.ID, classes.PIDM, classes.fName, classes.lName, classes.advisorOneFirst, classes.advisorOneLast, classes.advisorOneEmail, 
GROUP_CONCAT(classes.courseTitle) AS courses
FROM classes
WHERE term = :cterm AND (classes.MGrade = "F" OR classes.MGrade = "F~" OR classes.MGrade = "D" OR classes.MGrade = "D~")
GROUP BY classes.ID
ORDER BY lName ASC

`HTML
{% for student in classes %}
<tr>
<td>{{student.fName}}</td>
<td>{{student.courses}}</td>
</tr>
{% endfor %}

Для иллюстрации моя веб-страница выглядит следующим образом:

student1 course1,course2
student2 course3,course4

И я хочу, чтобы она выглядела следующим образом:

student1 course1
         course2
student2 course3
         course4

Также, используя

GROUP_CONCAT(classes.courseTitle SEPARATOR "<br>")

или любая другая замена приводит к:

student1 course1<br>course2
student2 course3<br>course4

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Twig автоматически экранирует ваши переменные для защиты от атак XSS, поэтому использование тегов <br> не работает.Используя GROUP_CONCAT(classes.courseTitle SEPARATOR "<br>"), обновите свою веточку, чтобы использовать raw filter:

{% for student in classes %}
<tr>
<td>{{student.fName}}</td>
<td>{{student.courses|raw}}</td>
</tr>
{% endfor %}

Update

Использование необработанного фильтраможет вызвать другие проблемы в зависимости от персонажей в курсах.Лучшим подходом было бы использовать символ, который вы можете разделить в качестве разделителя в group_concat, затем разделить на этот символ и зациклить каждый курс по ветке.Например, если вы использовали точку с запятой в качестве разделителя символов,

Конкат вашей группы будет выглядеть следующим образом:

GROUP_CONCAT(classes.courseTitle SEPARATOR ';')

И ваша веточка будет выглядеть так:

{% for student in classes %}
<tr>
    <td>{{ student.fName }}</td>
    <td>
    {% for course in student.courses|split(';') %}
        {{ course }}<br>
    {% endfor %}
    </td>
</tr>
{% endfor %}
0 голосов
/ 28 марта 2019

с учетом обобщенной таблицы:

 myTable
=========
foo | bar
----+----
foo1|bar1
foo2|bar2
foo1|bar3
foo2|bar4

SQL

SELECT foo,
GROUP_CONCAT(bar SEPARATOR "@@@") AS bars
FROM myTable
GROUP BY foo

HTML

{% for foobar in myTable %}
<tr>
    <td>{{foobar.foo}}</td>
    <td>
    {% for bar in foobar.bars|split("@@@") %}
    {{bar}}<br>
    {% endfor %}
    </td>
</tr>
{% endfor %}

представление веб-страницы

foo1 bar1
     bar3
foo2 bar2
     bar4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...