2017-05-09 4 views
2

私は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($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 

はどうもありがとうございました私の見解でのforeachのexemple

+0

は「ブロック」でコースを取得するには1つの使用に等しいです。たとえば。それらをモデルに移動するか、リポジトリレイヤを使用する場合は、そこに配置する必要があります –

答えて

2

LaravelのモデルでwhereIn()を使用します。そうしないとあなたが特定のIDによってそれらをフィルタリングすることができ

public function indexWeb() 
{ 
    return view('pages.web.program', [ 
     'all_courses' => Course::getAllCoursesByIds([1,2,3,4,5]), 
    ]); 
} 

public static function getAllCoursesByIds(array $ids) 
{ 
    return self::whereIn('bloc', $ids) 
     ->orderBy('title', 'asc) 
     ->get(); 
} 

コントローラでは、からのアクセスを得ることができます。あなたのビューでは、$ all_coursesを呼び出します。あなたは、コントローラからのクエリを分離する必要があり

$all_courses->filter(function ($course, $key) { 
    return $course->bloc === 1; 
}); 
0

何を実現しているのは、これらすべてのDBの呼び出しは、現在同期しているということですそれらの間に依存関係はありません。理論的には、それらを非同期に呼び出すことができれば、スクリプトは最後の項目が返されると即座にレンダリングされるため、より速く実行されます。

これを行うには、サーバーではなくクライアント(javascript)でレンダリングする必要があります。 PromisesまたはAsync/Awaitがおそらく最も効果的です。結局のところ、あなたのクライアントはあなたのlaravelベースのWebサービスへのすべての非同期呼び出しを行い、すべて完了したらレンダリングします。あなたはそれらのすべてを待つ必要はなく、レンダリングも非同期であることがわかります。

ReactPHPのようなものを使用してPHPのみを使用してこれを実現できます。

関連する問題