- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有五个表 students
、grades
、subjects
、terms
和 scores
。我正在对这些表执行内部联接以返回结果。这是我的模式的样子:
学生表:
students
--------
id *
name
class_id (fk)
主题表:
subjects
--------
id *
name
类表:
classes
--------
id *
name
术语表:
terms
--------
id *
name
分数表:
scores
---------------
id *
student_id (fk)
subject_id (fk)
class_id (fk)
term_id (fk)
score
我的 laravel 查询:
$scores = \DB::table('scores')
->join('students', 'students.id', '=', 'scores.student_id')
->join('subjects', 'subjects.id', '=', 'scores.subject_id')
->join('grades', 'grades.id', '=', 'scores.grade_id')
->join('terms', 'terms.id', '=', 'scores.term_id')
->select('students.first_name', 'students.surname', 'subjects.name as subject', 'grades.name as grade', 'terms.name as term', 'score')
->where('students.id', 1)
->whereBetween('scores.term_id', [1, 3])
->get();
当我死掉并转储它时查询返回的结果:
毫无疑问,查询返回了正确的结果,但问题是我希望结果像这样出现在我的 html 表中:
根据我现在在 Controller 和 View 中的代码,它是这样显示的。
Controller :
public function index()
{
//
$scores = \DB::table('scores')
->join('students', 'students.id', '=', 'scores.student_id')
->join('subjects', 'subjects.id', '=', 'scores.subject_id')
->join('grades', 'grades.id', '=', 'scores.grade_id')
->join('terms', 'terms.id', '=', 'scores.term_id')
->select('students.first_name', 'students.surname', 'subjects.name as subject', 'grades.name as grade', 'terms.name as term', 'score')
->where('students.id', 1)
->whereBetween('scores.term_id', [1, 3])
->get();
// finding details of the student based on id pased
$student = Student::findOrFail(1);
// getting the name of the student
$name = $student->first_name.' '.$student->surname;
// getting the class or grade of the student (grade 12 or grade 11)
$grade = $student->grade->name;
// getting the current date
$date = Score::date();
return view('scores.home', compact('scores', 'name', 'date', 'grade'));
查看:
<table class="table table-bordered table-condensed table-striped">
<thead>
<tr>
<th scope="row">Name</th>
<td colspan="4">{{$name}}</td>
</tr>
<tr>
<th scope="row">Class</th>
<td colspan="2">{{$grade}}</td>
<th scope="row">Date</th>
<td>{{$date->toFormattedDateString()}}</td>
</tr>
<tr>
<th class="text-center">Subject</th>
@foreach($scores as $score)
<th class="text-center">{{$score->term}}</th>
@endforeach
</tr>
</thead>
<tbody>
@foreach($scores as $score)
<tr>
<td>{{$score->subject}}</td>
<td>{{$score->score}}</td>
</tr>
@endforeach
</tbody>
</table>
结果:
如上面的结果所示,术语名称 1st Period
被重复,我该如何避免这种情况?如何在 View 或 Controller 中重构我的查询或代码以获得我想要的结果?
最佳答案
首先,我会稍微简化查询,只选择您不知道的数据。无需返回每一行的学生姓名和成绩,因为它们始终相同。
$student = Student::findOrFail(1);
$scores = \DB::table('scores')
->join('subjects', 'subjects.id', '=', 'scores.subject_id')
->join('terms', 'terms.id', '=', 'scores.term_id')
->select('subjects.name as subject', 'terms.name as term', 'score')
->where('scores.student_id', $student->id)
->whereBetween('scores.term_id', [1, 3])
->get();
您将得到以下与您的结果相似的集合:
[
0 => (object)[
'subject' => 'Mathematics',
'term' => '1st Period',
'score' => 99
],
1 => (object)[
'subject' => 'Biology',
'term' => '2nd Period',
'score' => 99
],
2 => (object)[
'subject' => 'Biology',
'term' => '3rd Period',
'score' => 79
]
]
现在将其转换为嵌套结构:
$scores = $scores->groupBy('subject')->map(function($item){
return $item->keyBy('term')->map(function($item){
return $item->score;
});
});
您将获得以下合集:
[
'Mathematics' => [
'1st Period' => 99,
],
'Biology' => [
'2nd Period' => 99,
'3nd Period' => 79
]
]
但这不是表结构——缺少一些术语。所以您需要以某种方式填写缺失的条款,因为您不想这样做。我会创建一个空表结构并将数据填充到其中:
$terms = Term::whereBetween('id', [1, 3])->pluck('name');
// returns: ['1st Period', '2nd Period', '3rd Period']
用空分数初始化表:
$scoreTable = [];
foreach ($scores->keys() as $subject){
$scoreTable[$subject] = [];
foreach ($terms as $term){
$scoreTable[$subject][$term] = '';
}
}
用给定的分数填表:
foreach ($scores as $subject => $row){
foreach($row as $term => $score){
$scoreTable[$subject][$term] = $score;
}
}
现在“表格”看起来像这样:
[
'Mathematics' => [
'1st Period' => 99,
'2nd Period' => '',
'3nd Period' => '',
],
'Biology' => [
'1st Period' => '',
'2nd Period' => 99,
'3nd Period' => 79,
],
]
将它传递给您的 View 并像这样呈现表格:
<table>
<tr>
<th>Subject</th>
@foreach($terms as $term)
<th>{{$term}}</th>
@endforeach
</tr>
@foreach($scoreTable as $subject => $scores)
<tr>
<td>{{$subject}}</td>
@foreach($terms as $term)
<td>{{$scores[$term]}}</td>
@endforeach
</tr>
@endforeach
</table>
您将获得以下 HTML 代码:
<table>
<tr>
<th>Subject</th>
<th>1st Period</th>
<th>2nd Period</th>
<th>3rd Period</th>
</tr>
<tr>
<td>Mathematics</td>
<td>99</td>
<td></td>
<td></td>
</tr>
<tr>
<td>Biology</td>
<td></td>
<td>99</td>
<td>79</td>
</tr>
</table>
获取 $scoreTable
的更短方法可能是
$terms = Term::whereBetween('id', [1, 3])->pluck('name');
$initRow = $terms
->keyBy(function($term){ return $term; })
->map(function(){ return ''; });
$scoreTable = $scores
->groupBy('subject')
->map(function($subject) use($initRow){
$row = $subject
->keyBy('term')
->map(function($term) use($initRow){
return $term->score;
});
return $initRow->merge($row);
});
但是看起来可读性不是很好。也可能有一个或另一个 collection
函数将取代 map
函数并使事情变得更容易。但我不认识他们所有人。
这是另一种更短的方法,但在更大的数据集上可能会很慢,因为昂贵的 where()
函数会为每个表格单元格调用两次。
$scoreTable = [];
foreach ($scores->pluck('subject')->unique() as $subject){
foreach ($scores->pluck('term')->unique() as $term) {
$scoreTable[$subject][$term] = $scores
->where('subject', $subject)
->where('term', $term)
->pluck('score')
->first();
}
}
最后我想出了以下解决方案,(我认为)这是最可读/最简单和最快速的。
$subjects = $scores->pluck('subject')->unique(); // ['Mathematics', 'Biology']
$terms = $scores->pluck('term')->unique(); // ['1st Period', '2nd Period', '3rd Period']
$scoreTable = [];
foreach ($subjects as $subject) {
foreach ($terms as $term) {
$scoreTable[$subject][$term] = '';
}
}
foreach ($scores as $row) {
$scoreTable[$row->subject][$row->term] = $row->score;
}
return view('scores.home', compact('scoreTable', 'terms', 'name', 'date', 'grade'));
前两行将从查询结果中提取唯一的主题和术语。 (有关 pluck() 和 unique() 方法的更多信息,您将在 laravel docs 中找到。)然后在以下嵌套循环中使用它们来生成具有空值的表结构(主题 ✕ 术语)。在下一个循环中,查询结果的分数被填充到那个“表”中。
关于php - 如何在 laravel View 或 Controller 中格式化连接查询结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45190326/
我知道这个问题可能已经被问过,但我检查了所有这些,我认为我的情况有所不同(请友善)。所以我有两个数据集,第一个是测试数据集,第二个是我保存在数据框中的预测(预测值,这就是没有数据列的原因)。我想合并两
在 .loc 方法的帮助下,我根据同一数据框中另一列中的值来识别 Panda 数据框中某一列中的值。 下面给出了代码片段供您引用: var1 = output_df['Player'].loc[out
当我在 Windows 中使用 WinSCP 通过 Ubuntu 连接到 VMware 时,它提示: The server rejected SFTP connection, but it lis
我正在开发一个使用 xml web 服务的 android 应用程序。在 wi-fi 网络中连接时工作正常,但在 3G 网络中连接时失败(未找到 http 404)。 这不仅仅发生在设备中。为了进行测
我有一个XIB包含我的控件的文件,加载到 Interface Builder(Snow Leopard 上的 Xcode 4.0.2)中。 文件的所有者被设置为 someClassController
我在本地计算机上管理 MySQL 数据库,并通过运行以下程序通过 C 连接到它: #include #include #include int main(int argc, char** arg
我不知道为什么每次有人访问我网站上的页面时,都会打开一个与数据库的新连接。最终我到达了大约 300 并收到错误并且页面不再加载。我认为它应该工作的方式是,我将 maxIdle 设置为 30,这意味着
希望清理 NMEA GPS 中的 .txt 文件。我当前的代码如下。 deletes = ['$GPGGA', '$GPGSA', '$GPGSV', '$PSRF156', ] searchquer
我有一个 URL、一个用户名和一个密码。我想在 C# .Net WinForms 中建立 VPN 连接。 你能告诉我从哪里开始吗?任何第三方 API? 代码示例将受到高度赞赏... 最佳答案 您可以像
有没有更好的方法将字符串 vector 转换为字符 vector ,字符串之间的终止符为零。 因此,如果我有一个包含以下字符串的 vector "test","my","string",那么我想接收一
我正在编写一个库,它不断检查 android 设备的连接,并在设备连接、断开连接或互联网连接变慢时给出回调。 https://github.com/muddassir235/connection_ch
我的操作系统:Centos 7 + CLOUDLINUX 7.7当我尝试从服务器登录Mysql时 [root@server3 ~]# Mysql -u root -h localhost -P 330
我收到错误:Puma 发现此错误:无法打开到本地主机的 TCP 连接:9200(连接被拒绝 - 连接(2)用于“本地主机”端口 9200)(Faraday::ConnectionFailed)在我的
请给我一些解决以下错误的方法。 这是一个聊天应用....代码和错误如下:: conversations_controller.rb def create if Conversation.bet
我想将两个单元格中的数据连接到一个单元格中。我还想只组合那些具有相同 ID 的单元格。 任务 ID 名称 4355.2 参与者 4355.2 领袖 4462.1 在线 4462.1 快速 4597.1
我经常需要连接 TSQL 中的字段... 使用“+”运算符时 TSQL 强制您处理的两个问题是 Data Type Precedence和 NULL 值。 使用数据类型优先级,问题是转换错误。 1)
有没有在 iPad 或 iPhone 应用程序中使用 Facebook 连接。 这个想法是登录这个应用程序,然后能够看到我的哪些 facebook 用户也在使用该应用程序及其功能。 最佳答案 是的。
我在连接或打印字符串时遇到了一个奇怪的问题。我有一个 char * ,可以将其设置为字符串文字的几个值之一。 char *myStrLiteral = NULL; ... if(blah) myS
对于以下数据 - let $x := "Yahooooo !!!! Select one number - " let $y := 1 2 3 4 5 6 7 我想得到
我正在看 UDEMY for perl 的培训视频,但是视频不清晰,看起来有错误。 培训展示了如何使用以下示例连接 2 个字符串: #!usr/bin/perl print $str = "Hi";
我是一名优秀的程序员,十分优秀!