- WIP on locale formatting since strftime is deprecated
- Added Limit and Offset attributes in RelationBuilder
This commit is contained in:
parent
2f482324b2
commit
b33c67b594
10
src/Attribute/Property/Limit.php
Normal file
10
src/Attribute/Property/Limit.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Ulmus\Attribute\Property;
|
||||
|
||||
#[\Attribute(\Attribute::TARGET_PROPERTY)]
|
||||
class Limit {
|
||||
public function __construct(
|
||||
public int $value,
|
||||
) {}
|
||||
}
|
10
src/Attribute/Property/Offset.php
Normal file
10
src/Attribute/Property/Offset.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
|
||||
namespace Ulmus\Attribute\Property;
|
||||
|
||||
#[\Attribute(\Attribute::TARGET_PROPERTY)]
|
||||
class Offset {
|
||||
public function __construct(
|
||||
public int $value,
|
||||
) {}
|
||||
}
|
@ -43,6 +43,13 @@ class Datetime extends \DateTime implements EntityObjectInterface {
|
||||
return strftime($format, $this->getTimestamp());
|
||||
}
|
||||
|
||||
public function formatLocaleIntl(int $dateFormatter = \IntlDateFormatter::LONG, int $timeFormatter = \IntlDateFormatter::NONE) : string
|
||||
{
|
||||
$formatter = new \IntlDateFormatter(\Locale::getDefault(), $dateFormatter, $timeFormatter, \Locale::getRegion());
|
||||
|
||||
return $formatter->format($this->getTimestamp());
|
||||
}
|
||||
|
||||
public function ageAt(null|\DateTime $dateTime) : int
|
||||
{
|
||||
return (int) ( (int) ($dateTime ?: new DateTime())->format('Ymd') - (int) $this->format('Ymd') ) / 10000;
|
||||
|
@ -6,9 +6,7 @@ use Ulmus\{
|
||||
Ulmus, Query, Common\EntityResolver, Repository, Event, Common\Sql
|
||||
};
|
||||
|
||||
use Ulmus\Attribute\Property\{
|
||||
Filter, Join, OrderBy, Relation, Virtual, Where, WithJoin,
|
||||
};
|
||||
use Ulmus\Attribute\Property\{Filter, Join, Limit, Offset, OrderBy, Relation, Virtual, Where, WithJoin};
|
||||
|
||||
class RelationBuilder
|
||||
{
|
||||
@ -30,6 +28,10 @@ class RelationBuilder
|
||||
|
||||
protected array $joins;
|
||||
|
||||
protected ? Limit $limit;
|
||||
|
||||
protected ? Offset $offset;
|
||||
|
||||
public function __construct(string|object $entity, ? Repository $repository = null)
|
||||
{
|
||||
$this->entity = $entity;
|
||||
@ -93,6 +95,8 @@ class RelationBuilder
|
||||
{
|
||||
if ( null !== ( $relation = $this->resolver->searchFieldAnnotation($name, [ Relation::class ] ) ) ) {
|
||||
$this->orders = $this->resolver->searchFieldAnnotationList($name, [ OrderBy::class ] );
|
||||
$this->limit = $this->resolver->searchFieldAnnotation($name, [ Limit::class ] );
|
||||
$this->offset = $this->resolver->searchFieldAnnotation($name, [ Offset::class ] );
|
||||
$this->wheres = $this->resolver->searchFieldAnnotationList($name, [ Where::class ] );
|
||||
$this->filters = $this->resolver->searchFieldAnnotationList($name, [ Filter::class ] );
|
||||
$this->joins = $this->resolver->searchFieldAnnotationList($name, [ WithJoin::class ] );
|
||||
@ -184,6 +188,17 @@ class RelationBuilder
|
||||
}
|
||||
}
|
||||
|
||||
protected function applyLimits() : void
|
||||
{
|
||||
if ($this->limit) {
|
||||
$this->repository->limit($this->limit->value);
|
||||
}
|
||||
|
||||
if ($this->offset) {
|
||||
$this->repository->offset($this->offset->value);
|
||||
}
|
||||
}
|
||||
|
||||
protected function instanciateEmptyEntity(string $name, Relation $relation) : object
|
||||
{
|
||||
$class = $relation->entity ?? $this->resolver->reflectedClass->getProperties()[$name]->getTypes()[0]->type;
|
||||
@ -264,7 +279,7 @@ class RelationBuilder
|
||||
|
||||
public function oneToOne(string $name, Relation $relation) : Repository
|
||||
{
|
||||
return $this->oneToMany($name, $relation)->limit(1);
|
||||
return $this->oneToMany($name, $relation)->limit($this->limit->value ?? 1);
|
||||
}
|
||||
|
||||
public function oneToMany(string $name, Relation $relation) : Repository
|
||||
@ -279,6 +294,8 @@ class RelationBuilder
|
||||
|
||||
$this->applyWithJoin();
|
||||
|
||||
$this->applyLimits();
|
||||
|
||||
$field = $relation->key;
|
||||
|
||||
if ($relation->foreignKey) {
|
||||
@ -324,6 +341,8 @@ class RelationBuilder
|
||||
|
||||
$this->applyWithJoin();
|
||||
|
||||
$this->applyLimits();
|
||||
|
||||
if ($selectBridgeField && $relation->bridgeField) {
|
||||
$this->repository->selectEntity($relation->bridge, $bridgeAlias, $bridgeAlias);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user