Laravel отправляет данные для работы в контроллере

В настоящее время мой HomeController выглядит так:

class HomeController extends BaseController {

public function getHome()
{
$scripts = Script::select('script.*', DB::raw('COALESCE(SUM(vote.rating), 0) as rating'))
->leftJoin('script_vote as vote', 'vote.script_id', '=', 'script.id')
->with('tags')
->orderBy('rating', 'desc')
->orderBy('views', 'desc')
->groupBy('id')
->paginate(8);

return View::make('home')->with('scripts', $scripts);
}

public function postSearch()
{
$input = array(
'query'    => Input::get('query'),
'sort_col' => Input::get('sort_col'),
'sort_dir' => Input::get('sort_dir'),
);

$scripts = Script::select('script.*', DB::raw('COALESCE(SUM(vote.rating), 0) as rating'))
->leftJoin('script_vote as vote', 'vote.script_id', '=', 'script.id')
->where('title', 'LIKE', '%' . $input['query'] . '%')
->orderBy($input['sort_col'], $input['sort_dir'])
->orderBy('views', 'desc')
->groupBy('id')
->with('tags')
->paginate(8);

Input::flash();

return View::make('home')->with('scripts', $scripts);
}

}

Как видите, я использую (почти) один и тот же большой запрос дважды. Я хотел бы позвонить postSearch() функция в пределах getHome() функция и дать три параметра (query = », sort_col = ‘rating’, sort_dir = ‘desc’) с ним. Это возможно?

0

Решение

Если вы планируете использовать это часто, я бы переместил это из вашего контроллера и поместил в вашу модель как Пользовательский объем запроса. Это действительно не место в контроллере, даже как частная функция.

public function scopeRating($query)
{
return $query->select('script.*', DB::raw('COALESCE(SUM(vote.rating), 0) as rating'))
->leftJoin('script_vote as vote', 'vote.script_id', '=', 'script.id')
->with('tags')
->orderBy('rating', 'desc')
->orderBy('views', 'desc')
->groupBy('id');
}

Это можно было бы назвать так

Script::rating();
1

Другие решения

Вот несколько возможностей:

  • Напиши private function getScripts(...) внутри контроллера (не так сексуально)
  • добавить getScripts(...) функция на вашей модели Scripts (со-ляла секси)
  • создать поставщик услуг инкапсулировать модели и ввести их в контроллер
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector