drh47606 2016-07-14 19:35
浏览 35

使用由模型属性和相关枢轴计数组成的字段创建包含订单的搜索表单

I'm trying to create a search form for my Laravel app. Basically a user can enter some fields (searchable model related, like the title) and sort it in different ways; title, create date, but also vote count or favorite count. The last two are results from a pivot table (many to many relations).

I've been struggling with this but I don't know how to proceed. Here's what I have so far:

public function search(SearchRequest $request)
{
    $posts = Post::where('published', 1);

    if (strlen($request->title) > 0) {
        $posts->where('title', 'like', '%' . $request->title . '%');
    }

    switch($request->order_by) {
        case 'title' : $orderBy = 'title'; break;
        case 'createDate' : $orderBy = 'created_at'; break;
        case 'favorites' : $orderBy = 'post_favorites.count(*)'; break;
        case 'votes' : $orderBy = 'post_votes.count(*)'; break;
    }

    $posts->orderBy($orderBy, $request->order_by_direction);
    $posts = $posts->get();

    var_dump($posts);
}

To keep it simple I've rewritten the code to a typical blog post example. Thanks for your suggestions.

  • 写回答

2条回答 默认 最新

  • dtcn30461 2016-07-14 20:29
    关注

    going to take a stab on it, but its not tested as got nothing to test it on etc, so bear with me, other might take it further simpler, but hope it helps.

    public function search(SearchRequest $request)
    {
    
        if(count($request->get('title')) > 0){
            $search_text = $request->get('title');
            $order_by = $request->get('order_by');
            $display_by = $request->get('order_by_direction');
    
            $search_results = Post::where('title', 'like', '%' . $search_text . '%')->get();
    
            if($display_by == 'asc') return this::orderSearchResults($search_results, $order_by);
    
            return this::orderSearchResults($search_results, $order_by)->reverse();
    
        } else {
            //do something else here
        }
    }
    
    private function orderSearchResults($search_results, $order_by)
    {
            switch ($order_by) {
                case 'title' :
                    return $search_results->sortby('title');
                    break;
                case 'createDate' :
                    return $search_results->sortby('created_at');
                    break;
                case 'favorites' :
                    return $search_results->sortby(function($search){
                        return count($search['post_favorites']);
                    });
                    break;
                case 'votes' :
                    return $search_results->sortby(function($search){
                        return count($search['post_votes']);
                    });
                    break;
                default :
                    return $search_results;
                    break;
            }
    }
    

    the second part is based on the resulted being returned as a collection etc.

    评论

报告相同问题?

悬赏问题

  • ¥15 Jenkins+k8s部署slave节点offline
  • ¥15 微信小游戏反编译后,出现找不到分包的情况
  • ¥15 如何实现从tello无人机上获取实时传输的视频流,然后将获取的视频通过yolov5进行检测
  • ¥15 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)
  • ¥15 怎么把多于硬盘空间放到根目录下
  • ¥15 Matlab问题解答有两个问题