2017-09-28 7 views
0

私は学生オブジェクトの配列を持っています。各学生は、配列コレクションとしての科目を持っています。各サブジェクトには異なる引数などに基づいて計算される関数getStatus()があるため、サブジェクトエンティティのステータスには実際のプロパティはありません。文字列を返すゲッターに基づいて配列コレクション内の特定のオブジェクトを数える方法

完了し、進行中で、保留中の科目の数をカウントし、生徒ごとに表で表示するにはどうすればよいですか?私はこのように私のコントローラで私の学生を取得することができ

:ループと、おそらく、その後

$students = $em->getRepository(Student::class)->findAll(); 

とは何とかそれを数えるが、私はどのように得ることはありません。

this answerのように、配列コレクションにフィルタを実装する関数を作成すると思っていましたが、そのフィルタを使用してgetStatus()をフィルタする方法を理解できません。

public function getSubjectsByStatus(string $status): ?Collection 
{ 
    $subjects = $this->subjects->matching(
     Criteria::create()->where(Criteria::expr()->eq($this->getStatus(), $status)) 
    ); 

    return $subjects ?? null; 
} 

して、返されたコレクションで、カウントを行うが、eq()の最初のパラメータは文字列でなければならないと私は持っていません。

私はまた、このような基準で->matchingを実装するために考えました文字列として使用できるサブジェクトエンティティのstatusプロパティ。プロパティを追加するのは良い考えではありません。

どのようにすべての科目、未決の科目、完了した科目、および優秀な科目で最善の方法を数えることができますか?

答えて

0

SQL/DQLクエリで問題を簡単に解決できるので、ステータス値をデータベースの実際のフィールドにすることを検討することをお勧めします。

それが事実であることがなければ、ここにあなたがあなたのgetSubjectsByStatusメソッド実装する方法です:

public function getSubjectsByStatus(string $status): ?Collection 
{ 
    return $this->tl1Configs->filter(function ($element) use ($status) { 
     return $element->getStatus() == $status; 
    }); 
} 

をしかし、あなただけのすべてのステータス値の量をカウントし、そのメソッドを3回呼び出した場合、あなたがループしていますあなたのコレクションの上に3回も。

"より良い"解決方法は、おそらくこれらのカウントを明示的に取得する特殊な方法を作ることでしょう。これは、あなたが望むものを達成するための単なる方法です。ステータスカウントの代わりにサブコレクションの配列を返す方法は、サブコレクションで実際に作業したい場合は別の解決策です(実際の用途に応じて決まります)。

public function getSubjectStatusCounts(): array 
{ 
    $statusCounts = []; 
    foreach ($this->tl1Configs as $subject) { 
     $statusCounts[$subject->getStatus()] = ($statusCounts[$subject->getStatus()] ?? 0) + 1; 
    } 

    return $statusCounts; 
} 
関連する問題