2017-11-11 72 views
0

我有方法,我ArticlesController爲根據要求GET參數排序的文章:爲什麼不進行排序的回調工作?

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 =評論(在交換機3的情況下),它只是不工作:

(1/1)班閉幕ErrorException對象無法轉換爲字符串

不知道爲什麼,在sortByDesc法上所謂的上校通過call_user_func 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; 

這將爲您的模型添加一個計數屬性,其中包含評論數。該公約是,它會存儲計數與關係,然後_count的名稱屬性......在你的情況$物品─> comments_count ...

希望這對你的作品...

+0

不錯的解決方案,但不知道爲什麼我的代碼會出錯? – Audiophile

+0

對於其中一個,call_user_func不會通過引用傳遞它的參數...所以我想這就是你在這裏得到的東西...你嘗試了call_user_func_array嗎?我相信這可能會奏效...... – Serge

相關問題