2014-10-19 75 views
0

目前我的HomeController看起来像这样内起作用:Laravel POST数据到控制器

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); 
    } 

} 

正如你所看到的,我使用(几乎)同样大的查询两次。我想在getHome()函数中调用postSearch()函数,并给它提供三个参数(query ='',sort_col ='rating',sort_dir ='desc')。这可能吗?

回答

1

如果您计划频繁使用此功能,我会将其移出您r控制器并将其放入您的Model中作为Custom Query Scope。即使作为私人功能,这在控制器中确实没有位置。

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(...)功能
  • 创建service provider以封装模型并将它们注入控制器