mirror of
https://github.com/AnimeThemes/animethemes-server.git
synced 2026-07-11 01:24:46 +02:00
40 lines
1.2 KiB
PHP
40 lines
1.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Concerns\Actions\Http\Api;
|
|
|
|
use App\Http\Api\Field\Aggregate\AggregateField;
|
|
use App\Http\Api\Field\Field;
|
|
use App\Http\Api\Query\Query;
|
|
use App\Http\Api\Schema\Schema;
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
|
|
trait AggregatesFields
|
|
{
|
|
/**
|
|
* Select aggregate fields for the query builder.
|
|
*/
|
|
public function withAggregates(Builder $builder, Query $query, Schema $schema): Builder
|
|
{
|
|
collect($schema->fields())
|
|
->filter(fn (Field $field) => $field instanceof AggregateField && $field->shouldAggregate($query))
|
|
->each(fn (AggregateField $selectedAggregate) => $selectedAggregate->with($query, $builder));
|
|
|
|
return $builder;
|
|
}
|
|
|
|
/**
|
|
* Load aggregate fields for the model.
|
|
*/
|
|
public function loadAggregates(Model $model, Query $query, Schema $schema): Model
|
|
{
|
|
collect($schema->fields())
|
|
->filter(fn (Field $field) => $field instanceof AggregateField && $field->shouldAggregate($query))
|
|
->each(fn (AggregateField $selectedAggregate) => $selectedAggregate->load($query, $model));
|
|
|
|
return $model;
|
|
}
|
|
}
|