我从laravel开始,我想就你的观点发表意见。
我有一个控制器。在这个控制器中,我返回一个视图和几个所有SQL查询的函数。
我的视图必须包含所有这些查询,因为我显示了不同类型的foreach。这是正确的做法,还是有更短/更合适的事情?
我的控制器:
protected function indexWeb()
{
return view('pages.web.program', [
'getAllCoursesBloc1' => $this->getAllCoursesBloc1(),
'getAllCoursesBloc2' => $this->getAllCoursesBloc2(),
'getAllCoursesBloc3' => $this->getAllCoursesBloc3(),
'getWebCoursesBloc1' => $this->getWebCoursesBloc1(),
'getWebCoursesBloc2' => $this->getWebCoursesBloc2(),
'getWebCoursesBloc3' => $this->getWebCoursesBloc3(),
$this->setMetasIndex()
]);
}
protected function getAllCoursesBloc1()
{
$courses = Course::where('bloc', 1)
->OrderBy('title', 'ASC')
->get();
return $courses;
}
protected function getAllCoursesBloc2()
{
$courses = Course::where('bloc', 2)
->OrderBy('title', 'ASC')
->get();
return $courses;
}
... and so on
在我看来是foreach的例子
@foreach($getWebCoursesBloc1 as $key => $course)
<tr class="link-row" data-href="{{ $course->slug }}">
<td class="program-table__orientation">{{ $course->orientation }}</td>
<td class="program-table__course">
<a href="{{ url('cours/'.$course->slug) }}" class="program-table__course__link">
<span class="program-table__course__name">{{ $course->title }}</span>
</a>
<span class="program-table__course__desc">{{ $course->shortdescription }}</span>
</td>
<td class="program-table__hour"><span>{{ $course->duration }}</span></td>
<td class="program-table__ects"><span>{{ $course->ects }}</span></td>
<td class="program-table__quad"><span>{{ $course->quadrimester }}</span></td>
</tr>
@endforeach
非常感谢
答案 0 :(得分:1)
在Laravel的模型中使用whereIn()。
public static function getAllCoursesByIds(array $ids)
{
return self::whereIn('bloc', $ids)
->orderBy('title', 'asc)
->get();
}
在控制器中,您可以通过以下方式访问:
public function indexWeb()
{
return view('pages.web.program', [
'all_courses' => Course::getAllCoursesByIds([1,2,3,4,5]),
]);
}
否则您可以按特定ID过滤它们。在您的视图中,请拨打$ all_courses。
要使用“block”的课程等于1,请使用:
$all_courses->filter(function ($course, $key) {
return $course->bloc === 1;
});
答案 1 :(得分:0)
您所意识到的是,所有这些数据库调用当前都是同步的,它们之间没有依赖关系。从理论上讲,如果你可以异步调用它们,脚本会运行得更快,因为它会在最后一个项目返回时立即呈现。
为此,您需要在客户端(javascript)而不是服务器中进行渲染。 Promises或Async/Await可能效果最佳。最终,您的客户端将对您的基于laravel的Web服务进行所有异步调用,并且一旦完成它就会呈现。你可能会发现,你甚至不需要等待所有这些,渲染也可以是异步的。
你可以使用PHP ReactPHP之类的东西来完成这个任务。