2017-11-11 1 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; 
     } 
    } 

모든 작품을 좋아하지만, 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)'를 사용할 수 없습니까? –

+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(); 

그럼 당신은 단순히 당신의 정렬에 comment_count를 사용할 수 있습니다 ...

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

이것은 코멘트 속성이 포함 된 카운트 속성을 모델에 추가합니다. 협약은 ... 당신의 경우 $의 article-> comments_count에서 ... _count 다음 관계의 이름을 가진 속성이 당신을 위해 작동

희망을 ... 카운트를 저장하는 것입니다

+0

좋은 해결책이지만 내 코드가 왜 오류를 일으키는 지 알지 못합니까? – Audiophile

+0

그럼, call_user_func는 참조로 params를 전달하지 않습니다 ... 그래서 나는 당신이 여기에 오는 것을 생각하고 있습니다 ... call_user_func_array를 시도 했습니까? 그게 효과가있을 거라 생각해. – Serge

관련 문제