diff --git a/README.md b/README.md index 2dfcbc0..45cf782 100644 --- a/README.md +++ b/README.md @@ -84,11 +84,11 @@ use App\Models\Order; class OrdersTable extends Component { + public array $computedColumns = ['posts_count']; + public function builder(): Builder { - return Order::with(['user' => function ($query) { - $query->select('id', 'name', 'email'); - }])->select('orders.id', 'orders.user_id', 'orders.status', 'orders.total', 'orders.invoiced', 'orders.created_at', 'orders.updated_at'); + return User::with(['roles', 'profile'])->withCount('posts'); } } ``` diff --git a/src/DataSource.php b/src/DataSource.php index 4b22e7f..b73c308 100644 --- a/src/DataSource.php +++ b/src/DataSource.php @@ -234,69 +234,6 @@ private function hasStartOrEndKey(array $value): bool return isset($value['start']) || isset($value['end']); } - public function filter(array $filters): void - { - foreach ($filters as $type => $values) { - match ($type) { - 'text' => $this->handleText($values), - 'number' => $this->handleNumber($values), - 'select' => $this->handleSelect($values), - 'multiselect' => $this->handleMultiSelect($values), - 'boolean' => $this->handleBoolean($values), - 'timepicker' => $this->handleTimePicker($values), - 'datepicker' => $this->handleDatePicker($values), - 'datetimepicker' => $this->handleDateTimePicker($values), - 'search_term' => $this->handleSearchTerm($values), - 'search_letter' => $this->handleSelectLetter($values), - default => throw InvalidFilterHandler::make($type), - }; - } - } - - private function handleSearchTerm(array $values): self - { - foreach ($values as $columnName => $searchTerm) { - if (strpos($columnName, '.')) { - [$relation, $subColumnName] = $this->parseColumnString($columnName); - if ($relation !== null) { - $this->query->whereHas($relation, function ($query) use ($subColumnName, $searchTerm) { - $query->where($subColumnName, 'like', '%'.$searchTerm.'%'); - }); - } - } else { - $qualifiedColumnName = $this->resolveTableNames($columnName); - if ($qualifiedColumnName) { - $this->query->where($qualifiedColumnName, 'like', '%'.$searchTerm.'%'); - } else { - $this->query->where($columnName, 'like', '%'.$searchTerm.'%'); - } - } - } - - return $this; - } - - private function handleSelectLetter(array $values): void - { - foreach ($values as $columnName => $value) { - if (strpos($columnName, '.')) { - [$relation, $subColumnName] = $this->parseColumnString($columnName); - if ($relation !== null) { - $this->query->whereHas($relation, function ($query) use ($subColumnName, $value) { - $query->where($subColumnName, 'like', $value.'%'); - }); - } - } else { - $qualifiedColumnName = $this->resolveTableNames($columnName); - if ($qualifiedColumnName) { - $this->query->where($qualifiedColumnName, 'like', $value.'%'); - } else { - $this->query->where($columnName, 'like', $value.'%'); - } - } - } - } - public function orderBy(string $columnName, string $sortDirection): self { if (strpos($columnName, '.')) { @@ -362,6 +299,69 @@ private function orderByManyToManyRelation($relationQuery, string $tableName, st ->orderBy("$relatedTable.$columnName", $sortDirection); } + public function filter(array $filters): void + { + foreach ($filters as $type => $values) { + match ($type) { + 'text' => $this->handleText($values), + 'number' => $this->handleNumber($values), + 'select' => $this->handleSelect($values), + 'multiselect' => $this->handleMultiSelect($values), + 'boolean' => $this->handleBoolean($values), + 'timepicker' => $this->handleTimePicker($values), + 'datepicker' => $this->handleDatePicker($values), + 'datetimepicker' => $this->handleDateTimePicker($values), + 'search_term' => $this->handleSearchTerm($values), + 'search_letter' => $this->handleSelectLetter($values), + default => throw InvalidFilterHandler::make($type), + }; + } + } + + private function handleSearchTerm(array $values): self + { + foreach ($values as $columnName => $searchTerm) { + if (strpos($columnName, '.')) { + [$relation, $subColumnName] = $this->parseColumnString($columnName); + if ($relation !== null) { + $this->query->whereHas($relation, function ($query) use ($subColumnName, $searchTerm) { + $query->where($subColumnName, 'like', '%'.$searchTerm.'%'); + }); + } + } else { + $qualifiedColumnName = $this->resolveTableNames($columnName); + if ($qualifiedColumnName) { + $this->query->where($qualifiedColumnName, 'like', '%'.$searchTerm.'%'); + } else { + $this->query->where($columnName, 'like', '%'.$searchTerm.'%'); + } + } + } + + return $this; + } + + private function handleSelectLetter(array $values): void + { + foreach ($values as $columnName => $value) { + if (strpos($columnName, '.')) { + [$relation, $subColumnName] = $this->parseColumnString($columnName); + if ($relation !== null) { + $this->query->whereHas($relation, function ($query) use ($subColumnName, $value) { + $query->where($subColumnName, 'like', $value.'%'); + }); + } + } else { + $qualifiedColumnName = $this->resolveTableNames($columnName); + if ($qualifiedColumnName) { + $this->query->where($qualifiedColumnName, 'like', $value.'%'); + } else { + $this->query->where($columnName, 'like', $value.'%'); + } + } + } + } + private function handleText(array $values): void { foreach ($values as $columnName => $value) { diff --git a/src/Filters/FilterBase.php b/src/Filters/FilterBase.php index 4703186..71322db 100644 --- a/src/Filters/FilterBase.php +++ b/src/Filters/FilterBase.php @@ -2,6 +2,7 @@ namespace TomShaw\ElectricGrid\Filters; +use ReflectionClass; use TomShaw\ElectricGrid\Filters\Traits\WithAttributes; class FilterBase @@ -15,6 +16,8 @@ public function __construct( public function type(string $name): bool { - return basename(get_called_class()) === $name; + $reflection = new ReflectionClass($this); + + return $reflection->getShortName() === $name; } }