私が要求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;
...それは... _count続い関係...あなたの場合$ article-> comments_countでの名前と属性で、これはあなたのために働く
希望の数を格納するということですクロージャの代わりに 'count($ article-> comments)'を引数として使うことはできませんか? –
@NathanHeffleyそれでは、それは何のために考えられますか? sortBy()の引数は、各Collection要素の要素のプロパティ名またはClosure戻り値を含む文字列でなければなりません。 https://laravel.com/docs/5.5/collections#method-sortby – Audiophile
コメントの数ではなく、コメントの数でソートする必要があります。call_user_funcが$を期待しているフィールドをカウントして返します。名前...したがって文字列の問題... – Serge