2017-11-11 11 views
0

私が要求GETパラメータに応じて記事をソートするための私のArticlesControllerのメソッドを持っています。ソートのコールバックが機能しないのはなぜですか?

protected static function sortArticles(Collection $articles, string $sort_by, string $order): Collection 
    { 
     $sortBy = function ($by, $order) use ($articles) { 
      if ($order === 'asc') { 
       $method = 'sortBy'; 
      } elseif ($order === 'desc') { 
       $method = 'sortByDesc'; 
      } 

      return call_user_func([$articles, $method], [$by]); 

     }; 


     switch ($sort_by) { 
      case 'title': 
       return $sortBy('title', $order); 
       break; 
      case 'views': 
       return $sortBy('views_count', $order); 
       break; 
      case 'comments': 
       return $sortBy(function ($article) { // This is my callback for sorting and it doesn't work as expected 
        return count($article->comments); 
       }, $order); 
       break; 
      case 'date': 
       return $sortBy('created_at', $order); 
       break; 
     } 
    } 

すべてがOKに動作しますが、ときsort_by =コメント(スイッチにおける第三の場合)、それだけでは動作しません:

クラス閉鎖の(1/1)ErrorExceptionオブジェクトが 文字列

に変換することができませんでした、なぜコル上call_user_funcによって呼び出さsortByDesc方法を知ってはいけませんlectionインスタンスは引数としてClosureを受け入れず、文字列に変換しようとします。 私が直接、すべてがうまく動作、コレクションにSORTBYやsortByDescを呼び出す場合:

case 'comments': 
    return $articles->sortBy(function ($article) { // Gives no errors 
     return count($article->comments); 
    }); 
    break; 
+0

...それは... _count続い関係...あなたの場合$ article-> comments_countでの名前と属性で、これはあなたのために働く

希望の数を格納するということですクロージャの代わりに 'count($ article-> comments)'を引数として使うことはできませんか? –

+0

@NathanHeffleyそれでは、それは何のために考えられますか? sortBy()の引数は、各Collection要素の要素のプロパティ名またはClosure戻り値を含む文字列でなければなりません。 https://laravel.com/docs/5.5/collections#method-sortby – Audiophile

+0

コメントの数ではなく、コメントの数でソートする必要があります。call_user_funcが$を期待しているフィールドをカウントして返します。名前...したがって文字列の問題... – Serge

答えて

1

モデルをフェッチする場合... withCount( 'コメント')機能を追加...として:

$articles = App\Article::with('comments')->withCount('comments')->get(); 

そして、あなたは、単にコメントの数が含まれているモデルにカウント属性が追加されます...あなたのソートに

case 'comments': 
    return $sortBy('comments_count', $order); 
    break; 

これをCOMMENT_COUNTを使用することができます。大会は

+0

ニースのソリューションですが、なぜ私のコードがエラーを起こすのか分かりませんか? – Audiophile

+0

まあ、call_user_funcは参照によってパラメータを渡しません...だから私はあなたがここに来ていると思っています...あなたはcall_user_func_arrayを試しましたか?それがうまくいくと思う... – Serge

関連する問題