duanbiao4035 2014-10-19 18:01
浏览 24
已采纳

Laravel发布数据以在控制器内运行

Currently my HomeController looks like this:

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

}

As you can see, I'm using (almost) the same big query twice. I would like to call the postSearch() function within the getHome() function and give the three parameters (query = '', sort_col = 'rating', sort_dir = 'desc') with it. Is this possible?

  • 写回答

2条回答 默认 最新

  • duankousong9637 2014-10-20 02:40
    关注

    If you plan on using this frequently I would move this out of your controller and put it in your Model as a Custom Query Scope. This really doesn't have a place in the Controller even as a private function.

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

    This could then be called like this

    Script::rating();
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c