2016-07-14 38 views
0

我試圖爲我的Laravel應用程序創建一個搜索表單。基本上用戶可以輸入一些字段(可搜索的模型相關的,如標題)並以不同的方式對其進行排序;標題,創建日期,還可以計票或計數。最後兩個是數據透視表(多對多關係)的結果。創建一個由模型屬性和相關軸數組成的字段排序的搜索表單

我一直在努力,但我不知道如何繼續。這是我到目前爲止:

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

爲了保持簡單,我已將代碼重寫爲典型的博客文章示例。感謝您的建議。

+0

以獲得更多的一個小細節,在你上面的例子你只按標題搜索,但顯示已選擇依賴於4個選項的結果?但是,如果沒有標題只是返回所有用戶或請求發佈的帖子?如果沒有,那麼你就可以將它包圍在if等等中,? –

+0

有點難以知道你正在嘗試着什麼。你能否澄清你正在尋找什麼或問題在哪裏? – user3158900

回答

1

會對它進行刺探,但它沒有測試,因爲沒有什麼可以測試它等等,所以與我一起裸露,其他可能會更簡單,但希望它可以幫助。

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

第二部分是基於所得到的返回作爲一個集合等

+0

這看起來很有希望,明天我會試一試!感謝西蒙! +1的努力 – Ben

0

我是在一個類似的情況,我必須得與不同領域的搜索選項(在名稱搜索,電子郵件用戶,電話等),並按帖子或姓名或電子郵件數量排序......並按預期工作。我試圖重寫代碼以匹配您提供的示例。

// if the user didn't fill the field, we assign default values 
    $searchText = $request->input('searchText') ?: null; // the terms we are looking for 
    $targetField = $request->input('targetField') ?: 'title'; // in which field we want to search 
    $orderBy = $request->input('orderBy') ?: 'id'; // field used to order the results 
    $order = $request->input('order') ?: 'DESC'; // order direction 

    // from here we start assembling our query depending on the request 
    $query = DB::table('posts')->select('*')->where('published', 1); 

    // if the user typed something in search bar, we look for those terms 
    $query->when($searchText, function($query) use ($searchText,$targetField) { 
    return $query->where($targetField,'like','%'.$searchText.'%'); 
    }); 

    // if the user wants to order by votes 
    $query->when($orderBy === 'votes', function ($query) use ($order) { 
    return $query->addSelect(DB::raw('(select count(post_id) from post_votes where post_votes.post_id = posts.id) AS nbvotes')) 
       ->orderBy('nbvotes',$order)); 
    }); 
    // apply same logic for favorites 

    // if the orderBy is neither favorites or votes, by name or email for example... 
    $query->when($orderBy != 'favorites' && $orderBy != 'votes', function ($query) use ($orderBy,$order) { 
    return $query->orderBy($orderBy,$order); 
    }); 

    // executing the query 
    $posts = $query->get(); 
相關問題