在我的情况下,有没有比做多个查询更好的方法?

时间:2017-05-09 17:36:00

标签: php laravel

我从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

非常感谢

2 个答案:

答案 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)而不是服务器中进行渲染。 PromisesAsync/Await可能效果最佳。最终,您的客户端将对您的基于laravel的Web服务进行所有异步调用,并且一旦完成它就会呈现。你可能会发现,你甚至不需要等待所有这些,渲染也可以是异步的。

你可以使用PHP ReactPHP之类的东西来完成这个任务。