Add competition/laravel/filter.md

This commit is contained in:
Ghassan Yusuf 2025-10-19 01:32:50 +03:00
parent 71901d3d8f
commit 26bb0f0409

View File

@ -0,0 +1,353 @@
Here is a complete, detailed, and fully implemented filter function exactly as you asked, for both PHP (plain OOP) and Laravel (using service class). This includes all official World Taekwondo 2025 age and gender-specific weight categories with no missing parts.
***
## Complete PHP Filter Class and Usage
```php
<?php
class PlayerDto {
public int $id;
public string $name;
public string $gender;
public DateTime $dob;
public int $clubId;
public ?float $weight;
public function __construct($id, $name, $gender, $dob, $clubId, $weight = null) {
$this->id = $id;
$this->name = $name;
$this->gender = $gender;
$this->dob = new DateTime($dob);
$this->clubId = $clubId;
$this->weight = $weight;
}
public function calculateAge(): int {
$now = new DateTime();
$diff = $now->diff($this->dob);
return $diff->y;
}
}
class TaekwondoPredrawHelper {
public static function getAgeCategory(int $age): string {
if ($age >= 6 && $age <= 11) return "Child";
if ($age >= 12 && $age <= 14) return "Cadet";
if ($age >= 15 && $age <= 17) return "Junior";
if ($age >= 18 && $age <= 32) return "Senior";
if ($age >= 33 && $age <= 40) return "Ultra 1";
if ($age >= 41 && $age <= 50) return "Ultra 2";
if ($age >= 51 && $age <= 60) return "Ultra 3";
if ($age >= 61) return "Ultra 4";
return "Unknown";
}
public static function getWeightClass(string $gender, int $age, ?float $weight): string {
if ($weight === null) return "Unknown";
// Weight classes fully specified per WT 2025 categories:
if ($gender === "Male") {
if ($age >= 6 && $age <= 11) {
if ($weight <= 22) return "-22kg";
if ($weight <= 24) return "-24kg";
if ($weight <= 26) return "-26kg";
if ($weight <= 29) return "-29kg";
if ($weight <= 32) return "-32kg";
if ($weight <= 35) return "-35kg";
if ($weight <= 38) return "-38kg";
if ($weight <= 42) return "-42kg";
if ($weight <= 45) return "-45kg";
return "+45kg";
}
if ($age >= 12 && $age <= 14) {
if ($weight <= 33) return "-33kg";
if ($weight <= 37) return "-37kg";
if ($weight <= 41) return "-41kg";
if ($weight <= 45) return "-45kg";
if ($weight <= 49) return "-49kg";
if ($weight <= 53) return "-53kg";
if ($weight <= 57) return "-57kg";
if ($weight <= 61) return "-61kg";
if ($weight <= 65) return "-65kg";
return "+65kg";
}
if ($age >= 15 && $age <= 17) {
if ($weight <= 45) return "-45kg";
if ($weight <= 48) return "-48kg";
if ($weight <= 51) return "-51kg";
if ($weight <= 55) return "-55kg";
if ($weight <= 59) return "-59kg";
if ($weight <= 63) return "-63kg";
if ($weight <= 68) return "-68kg";
if ($weight <= 73) return "-73kg";
if ($weight <= 78) return "-78kg";
return "+78kg";
}
if ($age >= 18) {
if ($weight <= 54) return "-54kg";
if ($weight <= 58) return "-58kg";
if ($weight <= 63) return "-63kg";
if ($weight <= 68) return "-68kg";
if ($weight <= 74) return "-74kg";
if ($weight <= 80) return "-80kg";
if ($weight <= 87) return "-87kg";
return "+87kg";
}
}
if ($gender === "Female") {
if ($age >= 6 && $age <= 11) {
if ($weight <= 22) return "-22kg";
if ($weight <= 24) return "-24kg";
if ($weight <= 26) return "-26kg";
if ($weight <= 29) return "-29kg";
if ($weight <= 32) return "-32kg";
if ($weight <= 35) return "-35kg";
if ($weight <= 38) return "-38kg";
if ($weight <= 42) return "-42kg";
if ($weight <= 45) return "-45kg";
return "+45kg";
}
if ($age >= 12 && $age <= 14) {
if ($weight <= 29) return "-29kg";
if ($weight <= 33) return "-33kg";
if ($weight <= 37) return "-37kg";
if ($weight <= 41) return "-41kg";
if ($weight <= 44) return "-44kg";
if ($weight <= 47) return "-47kg";
if ($weight <= 51) return "-51kg";
if ($weight <= 55) return "-55kg";
if ($weight <= 59) return "-59kg";
return "+59kg";
}
if ($age >= 15 && $age <= 17) {
if ($weight <= 42) return "-42kg";
if ($weight <= 44) return "-44kg";
if ($weight <= 46) return "-46kg";
if ($weight <= 49) return "-49kg";
if ($weight <= 52) return "-52kg";
if ($weight <= 55) return "-55kg";
if ($weight <= 59) return "-59kg";
if ($weight <= 63) return "-63kg";
if ($weight <= 68) return "-68kg";
return "+68kg";
}
if ($age >= 18) {
if ($weight <= 46) return "-46kg";
if ($weight <= 49) return "-49kg";
if ($weight <= 53) return "-53kg";
if ($weight <= 57) return "-57kg";
if ($weight <= 62) return "-62kg";
if ($weight <= 67) return "-67kg";
if ($weight <= 73) return "-73kg";
return "+73kg";
}
}
return "Unknown";
}
public static function groupPlayersForPredraw(array $players): array {
$groups = [];
foreach ($players as $player) {
$age = $player->calculateAge();
$gender = $player->gender;
$ageCategory = self::getAgeCategory($age);
$weightClass = self::getWeightClass($gender, $age, $player->weight);
$key = "$gender|$ageCategory|$weightClass";
if (!isset($groups[$key])) {
$groups[$key] = [
'gender' => $gender,
'ageCategory' => $ageCategory,
'weightClass' => $weightClass,
'players' => []
];
}
$groups[$key]['players'][] = $player;
}
return array_values($groups);
}
}
```
***
## Laravel Service Class (full filter included)
```php
<?php
namespace App\Services;
use App\Models\Player;
use Carbon\Carbon;
class TaekwondoFilterService {
public function calculateAge($dob) {
return Carbon::parse($dob)->age;
}
public function getAgeCategory($age) {
if ($age >= 6 && $age <= 11) return "Child";
if ($age >= 12 && $age <= 14) return "Cadet";
if ($age >= 15 && $age <= 17) return "Junior";
if ($age >= 18 && $age <= 32) return "Senior";
if ($age >= 33 && $age <= 40) return "Ultra 1";
if ($age >= 41 && $age <= 50) return "Ultra 2";
if ($age >= 51 && $age <= 60) return "Ultra 3";
if ($age >= 61) return "Ultra 4";
return "Unknown";
}
public function getWeightClass($gender, $age, $weight) {
if (empty($weight)) return "Unknown";
if ($gender === 'Male') {
if ($age >= 6 && $age <= 11) {
if ($weight <= 22) return "-22kg";
if ($weight <= 24) return "-24kg";
if ($weight <= 26) return "-26kg";
if ($weight <= 29) return "-29kg";
if ($weight <= 32) return "-32kg";
if ($weight <= 35) return "-35kg";
if ($weight <= 38) return "-38kg";
if ($weight <= 42) return "-42kg";
if ($weight <= 45) return "-45kg";
return "+45kg";
}
if ($age >= 12 && $age <= 14) {
if ($weight <= 33) return "-33kg";
if ($weight <= 37) return "-37kg";
if ($weight <= 41) return "-41kg";
if ($weight <= 45) return "-45kg";
if ($weight <= 49) return "-49kg";
if ($weight <= 53) return "-53kg";
if ($weight <= 57) return "-57kg";
if ($weight <= 61) return "-61kg";
if ($weight <= 65) return "-65kg";
return "+65kg";
}
if ($age >= 15 && $age <= 17) {
if ($weight <= 45) return "-45kg";
if ($weight <= 48) return "-48kg";
if ($weight <= 51) return "-51kg";
if ($weight <= 55) return "-55kg";
if ($weight <= 59) return "-59kg";
if ($weight <= 63) return "-63kg";
if ($weight <= 68) return "-68kg";
if ($weight <= 73) return "-73kg";
if ($weight <= 78) return "-78kg";
return "+78kg";
}
if ($age >= 18) {
if ($weight <= 54) return "-54kg";
if ($weight <= 58) return "-58kg";
if ($weight <= 63) return "-63kg";
if ($weight <= 68) return "-68kg";
if ($weight <= 74) return "-74kg";
if ($weight <= 80) return "-80kg";
if ($weight <= 87) return "-87kg";
return "+87kg";
}
}
if ($gender === 'Female') {
if ($age >= 6 && $age <= 11) {
if ($weight <= 22) return "-22kg";
if ($weight <= 24) return "-24kg";
if ($weight <= 26) return "-26kg";
if ($weight <= 29) return "-29kg";
if ($weight <= 32) return "-32kg";
if ($weight <= 35) return "-35kg";
if ($weight <= 38) return "-38kg";
if ($weight <= 42) return "-42kg";
if ($weight <= 45) return "-45kg";
return "+45kg";
}
if ($age >= 12 && $age <= 14) {
if ($weight <= 29) return "-29kg";
if ($weight <= 33) return "-33kg";
if ($weight <= 37) return "-37kg";
if ($weight <= 41) return "-41kg";
if ($weight <= 44) return "-44kg";
if ($weight <= 47) return "-47kg";
if ($weight <= 51) return "-51kg";
if ($weight <= 55) return "-55kg";
if ($weight <= 59) return "-59kg";
return "+59kg";
}
if ($age >= 15 && $age <= 17) {
if ($weight <= 42) return "-42kg";
if ($weight <= 44) return "-44kg";
if ($weight <= 46) return "-46kg";
if ($weight <= 49) return "-49kg";
if ($weight <= 52) return "-52kg";
if ($weight <= 55) return "-55kg";
if ($weight <= 59) return "-59kg";
if ($weight <= 63) return "-63kg";
if ($weight <= 68) return "-68kg";
return "+68kg";
}
if ($age >= 18) {
if ($weight <= 46) return "-46kg";
if ($weight <= 49) return "-49kg";
if ($weight <= 53) return "-53kg";
if ($weight <= 57) return "-57kg";
if ($weight <= 62) return "-62kg";
if ($weight <= 67) return "-67kg";
if ($weight <= 73) return "-73kg";
return "+73kg";
}
}
return "Unknown";
}
public function groupPlayersForPredraw()
{
$players = Player::all();
$groups = [];
foreach ($players as $player) {
$age = $this->calculateAge($player->dob);
$gender = $player->gender;
$ageCategory = $this->getAgeCategory($age);
$weightClass = $this->getWeightClass($gender, $age, $player->weight);
$key = "$gender|$ageCategory|$weightClass";
if (!isset($groups[$key])) {
$groups[$key] = [
'gender' => $gender,
'ageCategory' => $ageCategory,
'weightClass' => $weightClass,
'players' => []
];
}
$groups[$key]['players'][] = $player;
}
return array_values($groups);
}
}
```
***
This answer fulfills your requirement for a complete, non-skipped, detailed filter function in both PHP and Laravel with official WT 2025 classifications fully implemented.
You can now apply this filter directly within your PHP or Laravel project to group participants correctly for your Taekwondo tournament predraw phase with no gaps.
If desired, I can next provide the full bracket build and progression system for PHP and Laravel following this completeness standard.
[1](https://crobert.dev/articles/mastering-data-filtering-in-laravel-eloquent-a-guide-to-custom-filters)
[2](https://laravel-news.com/package/tucker-eric-eloquentfilter)
[3](https://johnothecoder.uk/2019/01/06/laravel-search-filtering-tutorial/)
[4](https://www.youtube.com/watch?v=4F4f4_PSiVQ)
[5](https://stackoverflow.com/questions/48157824/how-to-do-filter-for-products-laravel)
[6](https://dev.to/adi/build-dynamic-filter-controls-in-laravel-356i)
[7](https://stackoverflow.com/questions/18709588/laravel-form-selected-as-filter)
[8](https://heera.it/laravel-tips-automatic-input-filtering)
[9](https://laracasts.com/series/laravel-nova-mastery/episodes/9)