2017-01-11 27 views
0

特定のジャンルの書籍を検索する機能を作成しています。並べ替え以外はすべて正常に動作し、モデルに追加された「星」によって並べ替えられます。Laravel - ソート方法、追加フィールドの注文

機能:私は、私はエラーを取得する「星」でソートしようとすると

$genre = Genre::find($genre_id); 


    $phrase = $request->search; 
    $sort = $request->sort; 
    $order = $request['order']; 


    if (!isset($sort) || !in_array($sort, ['title', 'stars', 'created_at', 'author_id'])) 
     $sort = 'title'; 

    if (!isset($order) || !in_array($order, ['DESC', 'ASC'])) 
     $order = 'DESC'; 


    $result['name'] = $genre->name; 
    $result['results'] = Book::with('authors')->whereGenre_id($genre_id)->where('club_id', '=', $club_id) 
     ->where(function ($query) use ($phrase, $club_id, $sort, $order, $user) { 

      if (isset($phrase)) 
       $query->where('title', 'LIKE', '%' . $phrase . '%'); 
     }) 
     ->orderBy($sort, $order) 
     ->get(); 

Column not found: 1054 Unknown column 'stars' in 'order clause' (SQL: select * from books where genre_id = 1 and club_id = 24 and books . deleted_at is null order by stars desc)

私はこのことを理解し、星がデータベースに存在しませんが、どのように私ができますこれを機能させるには?

+0

を表示するデータベースの構造&モデル –

+0

I 'stars 'がデータベースに存在しないと言うので' $ sort'で 'orderBy'をしてはいけないと思います。 –

+0

星評価はどのように計算されますか?追加された値を並べ替えることの挫折は、データベースから*すべての*結果を最初に取り出し、次に計算された値を追加し、最後にソートする方法で並べ替える必要があるということです。大きな結果セットでは、このアプローチは遅くなることになります。また、DBから正しくページを設定することもできません。コレクションスライスに基づいてカスタムページネーションを作成する必要があります。 – Robert

答えて

0

これは、最終的な作業コードです:私は->get()->all()を変更@mith

$res = Book::with('authors') 
     ->where('genre_id', $genre_id) 
     ->where('club_id', $club_id) 
     ->where(function ($query) use ($phrase) { 
      if (isset($phrase)) 
       $query->where('title', 'LIKE', '%' . $phrase . '%'); 
     })->get(); 

    if($order == 'ASC'){ 
     $res = $res->sortBy($sort); 
    }else{ 
     $res = $res->sortByDesc($sort); 
    } 

    $result['results'] = $res->values()->all(); 

となって最終的な結果は次のようになります。

$result['results'] = $res->values()->all(); 

Laravel documentation - sortBy

関連する問題