From 8ba2671d411161a87081e84a1ca4f3eefd747dbb Mon Sep 17 00:00:00 2001 From: Bastian Lederer Date: Fri, 28 Nov 2025 11:29:31 +0100 Subject: [PATCH 1/4] Declare typed parameters that are null by default as nullable Since PHP 8.4 implicitly nullable parameters are deprecated. --- src/AliasedExpression.php | 2 +- src/Exception/InvalidRelationException.php | 4 ++-- src/Model.php | 2 +- src/Query.php | 2 +- src/Resolver.php | 22 +++++++++++----------- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/AliasedExpression.php b/src/AliasedExpression.php index ed733a2..dca03bc 100644 --- a/src/AliasedExpression.php +++ b/src/AliasedExpression.php @@ -17,7 +17,7 @@ class AliasedExpression extends Expression * @param ?array $columns The columns used by the expression * @param mixed ...$values The values for the expression */ - public function __construct(string $alias, string $statement, array $columns = null, ...$values) + public function __construct(string $alias, string $statement, ?array $columns = null, ...$values) { parent::__construct($statement, $columns, ...$values); diff --git a/src/Exception/InvalidRelationException.php b/src/Exception/InvalidRelationException.php index 51e81bb..215b704 100644 --- a/src/Exception/InvalidRelationException.php +++ b/src/Exception/InvalidRelationException.php @@ -17,9 +17,9 @@ class InvalidRelationException extends Exception * Create a new InvalidRelationException * * @param string $relation The relation name - * @param Model $model The target model + * @param ?Model $model The target model */ - public function __construct($relation, Model $model = null) + public function __construct($relation, ?Model $model = null) { $this->relation = (string) $relation; $this->model = $model; diff --git a/src/Model.php b/src/Model.php index 44baff7..4da680f 100644 --- a/src/Model.php +++ b/src/Model.php @@ -14,7 +14,7 @@ abstract class Model implements \ArrayAccess, \IteratorAggregate { use PropertiesWithDefaults; - final public function __construct(array $properties = null) + final public function __construct(?array $properties = null) { if ($this->hasProperties()) { $this->setProperties($properties); diff --git a/src/Query.php b/src/Query.php index bba87a7..0e4fff1 100644 --- a/src/Query.php +++ b/src/Query.php @@ -602,7 +602,7 @@ public function derive($relation, Model $source) * * @return static */ - public function createSubQuery(Model $target, $targetPath, Model $from = null, bool $link = true) + public function createSubQuery(Model $target, $targetPath, ?Model $from = null, bool $link = true) { $subQuery = (new static()) ->setDb($this->getDb()) diff --git a/src/Resolver.php b/src/Resolver.php index fd4f658..dc980f5 100644 --- a/src/Resolver.php +++ b/src/Resolver.php @@ -329,14 +329,14 @@ public function qualifyColumn($column, $tableName) * Qualify the given columns by the specified model * * @param iterable $columns - * @param Model $model Leave null in case $columns is {@see Resolver::requireAndResolveColumns()} + * @param ?Model $model Leave null in case $columns is {@see Resolver::requireAndResolveColumns()} * * @return array * * @throws InvalidArgumentException If $columns is not iterable * @throws InvalidArgumentException If $model is not passed and $columns is not a generator */ - public function qualifyColumns($columns, Model $model = null) + public function qualifyColumns($columns, ?Model $model = null) { $target = $model ?: $this->query->getModel(); $targetAlias = $this->getAlias($target); @@ -382,7 +382,7 @@ public function qualifyColumns($columns, Model $model = null) * Qualify the given columns and aliases by the specified model * * @param iterable $columns - * @param Model $model Leave null in case $columns is {@see Resolver::requireAndResolveColumns()} + * @param ?Model $model Leave null in case $columns is {@see Resolver::requireAndResolveColumns()} * @param bool $autoAlias Set an alias for columns which have none * * @return array @@ -390,7 +390,7 @@ public function qualifyColumns($columns, Model $model = null) * @throws InvalidArgumentException If $columns is not iterable * @throws InvalidArgumentException If $model is not passed and $columns is not a generator */ - public function qualifyColumnsAndAliases($columns, Model $model = null, $autoAlias = true) + public function qualifyColumnsAndAliases($columns, ?Model $model = null, $autoAlias = true) { $target = $model ?: $this->query->getModel(); $targetAlias = $this->getAlias($target); @@ -492,11 +492,11 @@ public function isDistinctRelation($path) * Also resolves all other relations. * * @param string $path - * @param Model $subject + * @param ?Model $subject * * @return Relation */ - public function resolveRelation($path, Model $subject = null) + public function resolveRelation($path, ?Model $subject = null) { $subject = $subject ?: $this->query->getModel(); if (! $this->resolvedRelations->contains($subject) || ! isset($this->resolvedRelations[$subject][$path])) { @@ -514,13 +514,13 @@ public function resolveRelation($path, Model $subject = null) * Traverses the entire path and yields the path travelled so far as key and the relation as value. * * @param string $path - * @param Model $subject + * @param ?Model $subject * * @return Generator * @throws InvalidArgumentException In case $path is not fully qualified * @throws InvalidRelationException In case a relation is unknown */ - public function resolveRelations($path, Model $subject = null) + public function resolveRelations($path, ?Model $subject = null) { $relations = explode('.', $path); $subject = $subject ?: $this->query->getModel(); @@ -593,14 +593,14 @@ public function resolveRelations($path, Model $subject = null) * * Related models will be automatically added for eager-loading. * - * @param array $columns - * @param Model $model + * @param array $columns + * @param ?Model $model * * @return Generator * * @throws InvalidColumnException If a column does not exist */ - public function requireAndResolveColumns(array $columns, Model $model = null) + public function requireAndResolveColumns(array $columns, ?Model $model = null) { $model = $model ?: $this->query->getModel(); $tableName = $model->getTableAlias(); From c77b67f54e1102430dda4674fd47a2c978a7b72c Mon Sep 17 00:00:00 2001 From: Bastian Lederer Date: Fri, 28 Nov 2025 11:44:40 +0100 Subject: [PATCH 2/4] Replace deprecated methods of SplObjectStorage The methods `contains()`, `attach()` and `detach()` of `SplObjectStorage` are deprecated since PHP 8.5 The functions `offsetExists()`, `offsetSet()` and `offsetUnset()` must be used instead. --- src/Query.php | 4 ++-- src/Resolver.php | 34 +++++++++++++++++----------------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/Query.php b/src/Query.php index 0e4fff1..76cd8d3 100644 --- a/src/Query.php +++ b/src/Query.php @@ -744,9 +744,9 @@ protected function groupColumnsByTarget(Generator $columns) $columnStorage = new SplObjectStorage(); foreach ($columns as list($target, $alias, $column)) { - if (! $columnStorage->contains($target)) { + if (! $columnStorage->offsetExists($target)) { $resolved = new ArrayObject(); - $columnStorage->attach($target, $resolved); + $columnStorage->offsetSet($target, $resolved); } else { $resolved = $columnStorage[$target]; } diff --git a/src/Resolver.php b/src/Resolver.php index dc980f5..a055bfe 100644 --- a/src/Resolver.php +++ b/src/Resolver.php @@ -81,10 +81,10 @@ public function __construct(Query $query) */ public function getRelations(Model $model) { - if (! $this->relations->contains($model)) { + if (! $this->relations->offsetExists($model)) { $relations = new Relations(); $model->createRelations($relations); - $this->relations->attach($model, $relations); + $this->relations->offsetSet($model, $relations); } return $this->relations[$model]; @@ -99,10 +99,10 @@ public function getRelations(Model $model) */ public function getBehaviors(Model $model) { - if (! $this->behaviors->contains($model)) { + if (! $this->behaviors->offsetExists($model)) { $behaviors = new Behaviors(); $model->createBehaviors($behaviors); - $this->behaviors->attach($model, $behaviors); + $this->behaviors->offsetSet($model, $behaviors); foreach ($behaviors as $behavior) { if ($behavior instanceof QueryAwareBehavior) { @@ -123,10 +123,10 @@ public function getBehaviors(Model $model) */ public function getDefaults(Model $model): Defaults { - if (! $this->defaults->contains($model)) { + if (! $this->defaults->offsetExists($model)) { $defaults = new Defaults(); $model->createDefaults($defaults); - $this->defaults->attach($model, $defaults); + $this->defaults->offsetSet($model, $defaults); } return $this->defaults[$model]; @@ -143,7 +143,7 @@ public function getDefaults(Model $model): Defaults */ public function getAlias(Model $model) { - if (! $this->aliases->contains($model)) { + if (! $this->aliases->offsetExists($model)) { throw new OutOfBoundsException(sprintf( "Can't get alias for model '%s'. Alias does not exist", get_class($model) @@ -202,7 +202,7 @@ public function setAliasPrefix($alias) */ public function hasSelectableColumn(Model $subject, $column) { - if (! $this->selectableColumns->contains($subject)) { + if (! $this->selectableColumns->offsetExists($subject)) { $this->collectColumns($subject); } @@ -223,7 +223,7 @@ public function hasSelectableColumn(Model $subject, $column) */ public function getSelectableColumns(Model $subject) { - if (! $this->selectableColumns->contains($subject)) { + if (! $this->selectableColumns->offsetExists($subject)) { $this->collectColumns($subject); } @@ -239,7 +239,7 @@ public function getSelectableColumns(Model $subject) */ public function getSelectColumns(Model $subject) { - if (! $this->selectColumns->contains($subject)) { + if (! $this->selectColumns->offsetExists($subject)) { $this->collectColumns($subject); } @@ -255,8 +255,8 @@ public function getSelectColumns(Model $subject) */ public function getColumnDefinitions(Model $subject) { - if (! $this->metaData->contains($subject)) { - $this->metaData->attach($subject, $this->collectMetaData($subject)); + if (! $this->metaData->offsetExists($subject)) { + $this->metaData->offsetSet($subject, $this->collectMetaData($subject)); } return $this->metaData[$subject]; @@ -499,7 +499,7 @@ public function isDistinctRelation($path) public function resolveRelation($path, ?Model $subject = null) { $subject = $subject ?: $this->query->getModel(); - if (! $this->resolvedRelations->contains($subject) || ! isset($this->resolvedRelations[$subject][$path])) { + if (! $this->resolvedRelations->offsetExists($subject) || ! isset($this->resolvedRelations[$subject][$path])) { foreach ($this->resolveRelations($path, $subject) as $_) { // run and exhaust generator } @@ -533,7 +533,7 @@ public function resolveRelations($path, ?Model $subject = null) } $resolvedRelations = []; - if ($this->resolvedRelations->contains($subject)) { + if ($this->resolvedRelations->offsetExists($subject)) { $resolvedRelations = $this->resolvedRelations[$subject]; } @@ -585,7 +585,7 @@ public function resolveRelations($path, ?Model $subject = null) $resolvedRelations[$pathBeingResolved] = $relation; } - $this->resolvedRelations->attach($subject, $resolvedRelations); + $this->resolvedRelations->offsetSet($subject, $resolvedRelations); } /** @@ -745,7 +745,7 @@ protected function collectColumns(Model $subject) // Don't fail if Model::getColumns() also contains the primary key columns $columns = array_merge((array) $subject->getKeyName(), (array) $subject->getColumns()); - $this->selectColumns->attach($subject, $columns); + $this->selectColumns->offsetSet($subject, $columns); $selectable = []; @@ -759,7 +759,7 @@ protected function collectColumns(Model $subject) } } - $this->selectableColumns->attach($subject, $selectable); + $this->selectableColumns->offsetSet($subject, $selectable); } /** From 6731f32ea0767011638aac72e6d13a9ddc0a6945 Mon Sep 17 00:00:00 2001 From: Bastian Lederer Date: Tue, 2 Dec 2025 11:07:49 +0100 Subject: [PATCH 3/4] Cleanup phpstan-baseline Errors that were no longer reported have been removed, keeping them in the baseline could hide future errors. --- phpstan-baseline.neon | 511 ++++++++++++++++++++++++++---------------- 1 file changed, 314 insertions(+), 197 deletions(-) diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 3fc5ac7..a206ee2 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -1,826 +1,943 @@ parameters: ignoreErrors: - - message: "#^Method ipl\\\\Orm\\\\AliasedExpression\\:\\:__construct\\(\\) has parameter \\$columns with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\AliasedExpression\:\:__construct\(\) has parameter \$columns with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/AliasedExpression.php - - message: "#^Cannot cast mixed to string\\.$#" + message: '#^Cannot cast mixed to string\.$#' + identifier: cast.string count: 1 path: src/Behavior/Binary.php - - message: "#^Parameter \\#1 \\$string of function bin2hex expects string, mixed given\\.$#" + message: '#^Parameter \#1 \$string of function bin2hex expects string, mixed given\.$#' + identifier: argument.type count: 1 path: src/Behavior/Binary.php - - message: "#^Parameter \\#2 \\.\\.\\.\\$values of function sprintf expects bool\\|float\\|int\\|string\\|null, mixed given\\.$#" + message: '#^Parameter \#2 \.\.\.\$values of function sprintf expects bool\|float\|int\|string\|null, mixed given\.$#' + identifier: argument.type count: 1 path: src/Behavior/Binary.php - - message: "#^Parameter \\#2 \\.\\.\\.\\$values of function sprintf expects bool\\|float\\|int\\|string\\|null, mixed given\\.$#" + message: '#^Parameter \#2 \.\.\.\$values of function sprintf expects bool\|float\|int\|string\|null, mixed given\.$#' + identifier: argument.type count: 1 path: src/Behavior/BoolCast.php - - message: "#^Parameter \\#3 \\.\\.\\.\\$values of function sprintf expects bool\\|float\\|int\\|string\\|null, mixed given\\.$#" + message: '#^Parameter \#3 \.\.\.\$values of function sprintf expects bool\|float\|int\|string\|null, mixed given\.$#' + identifier: argument.type count: 1 path: src/Behavior/BoolCast.php - - message: "#^Parameter \\#4 \\.\\.\\.\\$values of function sprintf expects bool\\|float\\|int\\|string\\|null, mixed given\\.$#" + message: '#^Parameter \#4 \.\.\.\$values of function sprintf expects bool\|float\|int\|string\|null, mixed given\.$#' + identifier: argument.type count: 1 path: src/Behavior/BoolCast.php - - message: "#^Cannot call method setTimezone\\(\\) on DateTime\\|false\\.$#" + message: '#^Cannot call method setTimezone\(\) on DateTime\|false\.$#' + identifier: method.nonObject count: 1 path: src/Behavior/MillisecondTimestamp.php - - message: "#^Parameter \\#1 \\$datetime of class DateTime constructor expects string, mixed given\\.$#" + message: '#^Parameter \#1 \$datetime of class DateTime constructor expects string, mixed given\.$#' + identifier: argument.type count: 1 path: src/Behavior/MillisecondTimestamp.php - - message: "#^Parameter \\#2 \\.\\.\\.\\$values of function sprintf expects bool\\|float\\|int\\|string\\|null, mixed given\\.$#" + message: '#^Parameter \#2 \.\.\.\$values of function sprintf expects bool\|float\|int\|string\|null, mixed given\.$#' + identifier: argument.type count: 1 path: src/Behavior/MillisecondTimestamp.php - - message: "#^Class ipl\\\\Orm\\\\Behaviors implements generic interface IteratorAggregate but does not specify its types\\: TKey, TValue$#" + message: '#^Class ipl\\Orm\\Behaviors implements generic interface IteratorAggregate but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 path: src/Behaviors.php - - message: "#^Method ipl\\\\Orm\\\\Behaviors\\:\\:add\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Behaviors\:\:add\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Behaviors.php - - message: "#^Method ipl\\\\Orm\\\\Behaviors\\:\\:getIterator\\(\\) return type with generic class ArrayIterator does not specify its types\\: TKey, TValue$#" + message: '#^Method ipl\\Orm\\Behaviors\:\:getIterator\(\) return type with generic class ArrayIterator does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 path: src/Behaviors.php - - message: "#^Method ipl\\\\Orm\\\\Behaviors\\:\\:persist\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Behaviors\:\:persist\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Behaviors.php - - message: "#^Method ipl\\\\Orm\\\\Behaviors\\:\\:retrieve\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Behaviors\:\:retrieve\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Behaviors.php - - message: "#^Parameter \\#1 \\$condition of method ipl\\\\Orm\\\\Contract\\\\RewriteFilterBehavior\\:\\:rewriteCondition\\(\\) expects ipl\\\\Stdlib\\\\Filter\\\\Condition, ipl\\\\Stdlib\\\\Filter\\\\Rule given\\.$#" + message: '#^Parameter \#1 \$condition of method ipl\\Orm\\Contract\\RewriteFilterBehavior\:\:rewriteCondition\(\) expects ipl\\Stdlib\\Filter\\Condition, ipl\\Stdlib\\Filter\\Rule given\.$#' + identifier: argument.type count: 1 path: src/Behaviors.php - - message: "#^Property ipl\\\\Orm\\\\Behaviors\\:\\:\\$behaviors type has no value type specified in iterable type array\\.$#" + message: '#^Property ipl\\Orm\\Behaviors\:\:\$behaviors type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Behaviors.php - - message: "#^Method ipl\\\\Orm\\\\ColumnDefinition\\:\\:fromArray\\(\\) has parameter \\$options with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\ColumnDefinition\:\:fromArray\(\) has parameter \$options with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/ColumnDefinition.php - - message: "#^Method ipl\\\\Orm\\\\Common\\\\SortUtil\\:\\:createOrderBy\\(\\) has parameter \\$sort with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Common\\SortUtil\:\:createOrderBy\(\) has parameter \$sort with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Common/SortUtil.php - - message: "#^Method ipl\\\\Orm\\\\Common\\\\SortUtil\\:\\:explodeSortSpec\\(\\) has parameter \\$sort with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Common\\SortUtil\:\:explodeSortSpec\(\) has parameter \$sort with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Common/SortUtil.php - - message: "#^Method ipl\\\\Orm\\\\Common\\\\SortUtil\\:\\:explodeSortSpec\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Common\\SortUtil\:\:explodeSortSpec\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Common/SortUtil.php - - message: "#^Method ipl\\\\Orm\\\\Common\\\\SortUtil\\:\\:normalizeSortSpec\\(\\) has parameter \\$sort with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Common\\SortUtil\:\:normalizeSortSpec\(\) has parameter \$sort with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Common/SortUtil.php - - message: "#^Method ipl\\\\Orm\\\\Common\\\\SortUtil\\:\\:splitColumnAndDirection\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Common\\SortUtil\:\:splitColumnAndDirection\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Common/SortUtil.php - - message: "#^Cannot use array destructuring on array\\\\|false\\.$#" + message: '#^Method ipl\\Orm\\Compat\\FilterProcessor\:\:apply\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Compat/FilterProcessor.php - - message: "#^Method ipl\\\\Orm\\\\Compat\\\\FilterProcessor\\:\\:apply\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Compat\\FilterProcessor\:\:requireAndResolveFilterColumns\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Compat/FilterProcessor.php - - message: "#^Method ipl\\\\Orm\\\\Compat\\\\FilterProcessor\\:\\:requireAndResolveFilterColumns\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Compat\\FilterProcessor\:\:requireAndResolveFilterColumns\(\) has parameter \$forceOptimization with no type specified\.$#' + identifier: missingType.parameter count: 1 path: src/Compat/FilterProcessor.php - - message: "#^Method ipl\\\\Orm\\\\Compat\\\\FilterProcessor\\:\\:requireAndResolveFilterColumns\\(\\) has parameter \\$forceOptimization with no type specified\\.$#" + message: '#^Parameter \#1 \$filter of method ipl\\Orm\\Query\:\:filter\(\) expects ipl\\Stdlib\\Filter\\Rule, ipl\\Stdlib\\Filter\\Chain\|null given\.$#' + identifier: argument.type count: 1 path: src/Compat/FilterProcessor.php - - message: "#^Parameter \\#1 \\$filter of method ipl\\\\Orm\\\\Query\\:\\:filter\\(\\) expects ipl\\\\Stdlib\\\\Filter\\\\Rule, ipl\\\\Stdlib\\\\Filter\\\\Chain\\|null given\\.$#" + message: '#^Parameter \#1 \$path of method ipl\\Orm\\Resolver\:\:isDistinctRelation\(\) expects string, mixed given\.$#' + identifier: argument.type count: 1 path: src/Compat/FilterProcessor.php - - message: "#^Parameter \\#1 \\$path of method ipl\\\\Orm\\\\Resolver\\:\\:isDistinctRelation\\(\\) expects string, mixed given\\.$#" + message: '#^Parameter \#1 \$path of method ipl\\Orm\\Resolver\:\:qualifyPath\(\) expects string, mixed given\.$#' + identifier: argument.type count: 1 path: src/Compat/FilterProcessor.php - - message: "#^Parameter \\#1 \\$path of method ipl\\\\Orm\\\\Resolver\\:\\:qualifyPath\\(\\) expects string, mixed given\\.$#" + message: '#^Parameter \#1 \$subject of method ipl\\Orm\\Resolver\:\:hasSelectableColumn\(\) expects ipl\\Orm\\Model, ipl\\Orm\\Model\|null given\.$#' + identifier: argument.type count: 1 path: src/Compat/FilterProcessor.php - - message: "#^Parameter \\#1 \\$path of method ipl\\\\Orm\\\\Resolver\\:\\:resolveRelation\\(\\) expects string, int\\|string given\\.$#" + message: '#^Parameter \#2 \$model of class ipl\\Orm\\Exception\\InvalidColumnException constructor expects ipl\\Orm\\Model, ipl\\Orm\\Model\|null given\.$#' + identifier: argument.type count: 1 path: src/Compat/FilterProcessor.php - - message: "#^Parameter \\#1 \\$subject of method ipl\\\\Orm\\\\Resolver\\:\\:hasSelectableColumn\\(\\) expects ipl\\\\Orm\\\\Model, ipl\\\\Orm\\\\Model\\|null given\\.$#" + message: '#^Parameter \#2 \$value of static method ipl\\Stdlib\\Filter\:\:like\(\) expects array\\|string, mixed given\.$#' + identifier: argument.type count: 1 path: src/Compat/FilterProcessor.php - - message: "#^Parameter \\#2 \\$model of class ipl\\\\Orm\\\\Exception\\\\InvalidColumnException constructor expects ipl\\\\Orm\\\\Model, ipl\\\\Orm\\\\Model\\|null given\\.$#" + message: '#^Property ipl\\Orm\\Compat\\FilterProcessor\:\:\$baseJoins has no type specified\.$#' + identifier: missingType.property count: 1 path: src/Compat/FilterProcessor.php - - message: "#^Parameter \\#2 \\$targetPath of method ipl\\\\Orm\\\\Query\\:\\:createSubQuery\\(\\) expects string, int\\|string given\\.$#" + message: '#^Property ipl\\Orm\\Compat\\FilterProcessor\:\:\$madeJoins has no type specified\.$#' + identifier: missingType.property count: 1 path: src/Compat/FilterProcessor.php - - message: "#^Parameter \\#2 \\$value of static method ipl\\\\Stdlib\\\\Filter\\:\\:equal\\(\\) expects array\\|bool\\|float\\|int\\|string, mixed given\\.$#" - count: 1 - path: src/Compat/FilterProcessor.php - - - - message: "#^Parameter \\#2 \\$value of static method ipl\\\\Stdlib\\\\Filter\\:\\:like\\(\\) expects array\\\\|string, mixed given\\.$#" - count: 1 - path: src/Compat/FilterProcessor.php - - - - message: "#^Property ipl\\\\Orm\\\\Compat\\\\FilterProcessor\\:\\:\\$baseJoins has no type specified\\.$#" - count: 1 - path: src/Compat/FilterProcessor.php - - - - message: "#^Property ipl\\\\Orm\\\\Compat\\\\FilterProcessor\\:\\:\\$madeJoins has no type specified\\.$#" - count: 1 - path: src/Compat/FilterProcessor.php - - - - message: "#^Method ipl\\\\Orm\\\\Contract\\\\PersistBehavior\\:\\:persist\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Contract\\PersistBehavior\:\:persist\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Contract/PersistBehavior.php - - message: "#^Method ipl\\\\Orm\\\\Contract\\\\PropertyBehavior\\:\\:__construct\\(\\) has parameter \\$properties with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Contract\\PropertyBehavior\:\:__construct\(\) has parameter \$properties with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Contract/PropertyBehavior.php - - message: "#^Method ipl\\\\Orm\\\\Contract\\\\PropertyBehavior\\:\\:persist\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Contract\\PropertyBehavior\:\:persist\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Contract/PropertyBehavior.php - - message: "#^Method ipl\\\\Orm\\\\Contract\\\\PropertyBehavior\\:\\:retrieve\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Contract\\PropertyBehavior\:\:retrieve\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Contract/PropertyBehavior.php - - message: "#^Property ipl\\\\Orm\\\\Contract\\\\PropertyBehavior\\:\\:\\$properties type has no value type specified in iterable type array\\.$#" + message: '#^Property ipl\\Orm\\Contract\\PropertyBehavior\:\:\$properties type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Contract/PropertyBehavior.php - - message: "#^Method ipl\\\\Orm\\\\Contract\\\\RetrieveBehavior\\:\\:retrieve\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Contract\\RetrieveBehavior\:\:retrieve\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Contract/RetrieveBehavior.php - - message: "#^Class ipl\\\\Orm\\\\Defaults implements generic interface IteratorAggregate but does not specify its types\\: TKey, TValue$#" + message: '#^Class ipl\\Orm\\Defaults implements generic interface IteratorAggregate but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 path: src/Defaults.php - - message: "#^Method ipl\\\\Orm\\\\Defaults\\:\\:add\\(\\) return type has no value type specified in iterable type \\$this\\(ipl\\\\Orm\\\\Defaults\\)\\.$#" + message: '#^Method ipl\\Orm\\Defaults\:\:add\(\) return type has no value type specified in iterable type \$this\(ipl\\Orm\\Defaults\)\.$#' + identifier: missingType.iterableValue count: 1 path: src/Defaults.php - - message: "#^Method ipl\\\\Orm\\\\Defaults\\:\\:getIterator\\(\\) return type has no value type specified in iterable type Traversable\\.$#" + message: '#^Method ipl\\Orm\\Defaults\:\:getIterator\(\) return type has no value type specified in iterable type Traversable\.$#' + identifier: missingType.iterableValue count: 1 path: src/Defaults.php - - message: "#^Property ipl\\\\Orm\\\\Exception\\\\InvalidRelationException\\:\\:\\$model \\(ipl\\\\Orm\\\\Model\\) does not accept ipl\\\\Orm\\\\Model\\|null\\.$#" + message: '#^Property ipl\\Orm\\Exception\\InvalidRelationException\:\:\$model \(ipl\\Orm\\Model\) does not accept ipl\\Orm\\Model\|null\.$#' + identifier: assign.propertyType count: 1 path: src/Exception/InvalidRelationException.php - - message: "#^Cannot call method getName\\(\\) on mixed\\.$#" + message: '#^Cannot call method getName\(\) on mixed\.$#' + identifier: method.nonObject count: 1 path: src/Hydrator.php - - message: "#^Method ipl\\\\Orm\\\\Hydrator\\:\\:extractAndMap\\(\\) has parameter \\$columnToPropertyMap with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Hydrator\:\:extractAndMap\(\) has parameter \$columnToPropertyMap with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Hydrator.php - - message: "#^Method ipl\\\\Orm\\\\Hydrator\\:\\:extractAndMap\\(\\) has parameter \\$data with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Hydrator\:\:extractAndMap\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Hydrator.php - - message: "#^Method ipl\\\\Orm\\\\Hydrator\\:\\:extractAndMap\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Hydrator\:\:extractAndMap\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Hydrator.php - - message: "#^Method ipl\\\\Orm\\\\Hydrator\\:\\:hydrate\\(\\) has parameter \\$data with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Hydrator\:\:hydrate\(\) has parameter \$data with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Hydrator.php - - message: "#^Property ipl\\\\Orm\\\\Hydrator\\:\\:\\$hydrators type has no value type specified in iterable type array\\.$#" + message: '#^Property ipl\\Orm\\Hydrator\:\:\$hydrators type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Hydrator.php - - message: "#^Class ipl\\\\Orm\\\\Model implements generic interface ArrayAccess but does not specify its types\\: TKey, TValue$#" + message: '#^Class ipl\\Orm\\Model implements generic interface ArrayAccess but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 path: src/Model.php - - message: "#^Class ipl\\\\Orm\\\\Model implements generic interface IteratorAggregate but does not specify its types\\: TKey, TValue$#" + message: '#^Class ipl\\Orm\\Model implements generic interface IteratorAggregate but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 path: src/Model.php - - message: "#^Method ipl\\\\Orm\\\\Model\\:\\:__construct\\(\\) has parameter \\$properties with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Model\:\:__construct\(\) has parameter \$properties with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Model.php - - message: "#^Method ipl\\\\Orm\\\\Model\\:\\:createBehaviors\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Model\:\:createBehaviors\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Model.php - - message: "#^Method ipl\\\\Orm\\\\Model\\:\\:createDefaults\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Model\:\:createDefaults\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Model.php - - message: "#^Method ipl\\\\Orm\\\\Model\\:\\:createDefaults\\(\\) has parameter \\$defaults with no value type specified in iterable type ipl\\\\Orm\\\\Defaults\\.$#" + message: '#^Method ipl\\Orm\\Model\:\:createDefaults\(\) has parameter \$defaults with no value type specified in iterable type ipl\\Orm\\Defaults\.$#' + identifier: missingType.iterableValue count: 1 path: src/Model.php - - message: "#^Method ipl\\\\Orm\\\\Model\\:\\:createRelations\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Model\:\:createRelations\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Model.php - - message: "#^Method ipl\\\\Orm\\\\Model\\:\\:getColumnDefinitions\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Model\:\:getColumnDefinitions\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Model.php - - message: "#^Method ipl\\\\Orm\\\\Model\\:\\:getDefaultSort\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Model\:\:getDefaultSort\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Model.php - - message: "#^Method ipl\\\\Orm\\\\Model\\:\\:getProperty\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Model\:\:getProperty\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Model.php - - message: "#^Method ipl\\\\Orm\\\\Model\\:\\:getProperty\\(\\) has parameter \\$key with no type specified\\.$#" + message: '#^Method ipl\\Orm\\Model\:\:getProperty\(\) has parameter \$key with no type specified\.$#' + identifier: missingType.parameter count: 1 path: src/Model.php - - message: "#^Method ipl\\\\Orm\\\\Model\\:\\:getSearchColumns\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Model\:\:getSearchColumns\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Model.php - - message: "#^Method ipl\\\\Orm\\\\Model\\:\\:init\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Model\:\:init\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Model.php - - message: "#^Parameter \\#1 \\$properties of method ipl\\\\Orm\\\\Model\\:\\:setProperties\\(\\) expects array, array\\|null given\\.$#" + message: '#^Parameter \#1 \$properties of method ipl\\Orm\\Model\:\:setProperties\(\) expects array, array\|null given\.$#' + identifier: argument.type count: 1 path: src/Model.php - - message: "#^Cannot access an offset on mixed\\.$#" + message: '#^Cannot access an offset on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 path: src/Query.php - - message: "#^Cannot access offset mixed on mixed\\.$#" + message: '#^Cannot access offset mixed on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 1 path: src/Query.php - - message: "#^Cannot call method getArrayCopy\\(\\) on mixed\\.$#" + message: '#^Cannot call method getArrayCopy\(\) on mixed\.$#' + identifier: method.nonObject count: 2 path: src/Query.php - - message: "#^Cannot call method getJoinType\\(\\) on mixed\\.$#" + message: '#^Cannot call method getJoinType\(\) on mixed\.$#' + identifier: method.nonObject count: 1 path: src/Query.php - - message: "#^Cannot call method resolve\\(\\) on mixed\\.$#" + message: '#^Cannot call method resolve\(\) on mixed\.$#' + identifier: method.nonObject count: 1 path: src/Query.php - - message: "#^Class ipl\\\\Orm\\\\Query implements generic interface IteratorAggregate but does not specify its types\\: TKey, TValue$#" + message: '#^Class ipl\\Orm\\Query implements generic interface IteratorAggregate but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 path: src/Query.php - - message: "#^Method ipl\\\\Orm\\\\Query\\:\\:columns\\(\\) has parameter \\$columns with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Query\:\:columns\(\) has parameter \$columns with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Query.php - - message: "#^Method ipl\\\\Orm\\\\Query\\:\\:count\\(\\) should return int but returns int\\|string\\|false\\|null\\.$#" + message: '#^Method ipl\\Orm\\Query\:\:dump\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Query.php - - message: "#^Method ipl\\\\Orm\\\\Query\\:\\:dump\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Query\:\:first\(\) should return ipl\\Orm\\Model\|null but returns mixed\.$#' + identifier: return.type count: 1 path: src/Query.php - - message: "#^Method ipl\\\\Orm\\\\Query\\:\\:first\\(\\) should return ipl\\\\Orm\\\\Model\\|null but returns mixed\\.$#" + message: '#^Method ipl\\Orm\\Query\:\:getColumns\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Query.php - - message: "#^Method ipl\\\\Orm\\\\Query\\:\\:getColumns\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Query\:\:groupColumnsByTarget\(\) return type with generic class SplObjectStorage does not specify its types\: TObject, TData$#' + identifier: missingType.generics count: 1 path: src/Query.php - - message: "#^Method ipl\\\\Orm\\\\Query\\:\\:groupColumnsByTarget\\(\\) return type with generic class SplObjectStorage does not specify its types\\: TObject, TData$#" + message: '#^Method ipl\\Orm\\Query\:\:with\(\) has parameter \$relations with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Query.php - - message: "#^Method ipl\\\\Orm\\\\Query\\:\\:with\\(\\) has parameter \\$relations with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Query\:\:withColumns\(\) has parameter \$columns with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Query.php - - message: "#^Method ipl\\\\Orm\\\\Query\\:\\:withColumns\\(\\) has parameter \\$columns with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Query\:\:without\(\) has parameter \$relations with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Query.php - - message: "#^Method ipl\\\\Orm\\\\Query\\:\\:without\\(\\) has parameter \\$relations with no value type specified in iterable type array\\.$#" + message: '#^Parameter \#1 \$model of method ipl\\Orm\\Resolver\:\:getAlias\(\) expects ipl\\Orm\\Model, mixed given\.$#' + identifier: argument.type count: 1 path: src/Query.php - - message: "#^Parameter \\#1 \\$model of method ipl\\\\Orm\\\\Resolver\\:\\:getAlias\\(\\) expects ipl\\\\Orm\\\\Model, mixed given\\.$#" + message: '#^Parameter \#1 \$objectOrClass of class ReflectionClass constructor expects class\-string\\|T of object, string given\.$#' + identifier: argument.type count: 1 path: src/Query.php - - message: "#^Parameter \\#1 \\$object of method SplObjectStorage\\\\:\\:attach\\(\\) expects object, mixed given\\.$#" + message: '#^Parameter \#1 \$subject of method ipl\\Orm\\Resolver\:\:getSelectColumns\(\) expects ipl\\Orm\\Model, mixed given\.$#' + identifier: argument.type count: 1 path: src/Query.php - - message: "#^Parameter \\#1 \\$object of method SplObjectStorage\\\\:\\:contains\\(\\) expects object, mixed given\\.$#" + message: '#^Parameter \#2 \$model of method ipl\\Orm\\Resolver\:\:qualifyColumns\(\) expects ipl\\Orm\\Model\|null, object given\.$#' + identifier: argument.type count: 1 path: src/Query.php - - message: "#^Parameter \\#1 \\$objectOrClass of class ReflectionClass constructor expects class\\-string\\\\|T of object, string given\\.$#" + message: '#^Parameter \#2 \$model of method ipl\\Orm\\Resolver\:\:qualifyColumnsAndAliases\(\) expects ipl\\Orm\\Model\|null, object given\.$#' + identifier: argument.type count: 1 path: src/Query.php - - message: "#^Parameter \\#1 \\$subject of method ipl\\\\Orm\\\\Resolver\\:\\:getSelectColumns\\(\\) expects ipl\\\\Orm\\\\Model, mixed given\\.$#" + message: '#^Property ipl\\Orm\\Query\:\:\$columns type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Query.php - - message: "#^Parameter \\#2 \\$model of method ipl\\\\Orm\\\\Resolver\\:\\:qualifyColumns\\(\\) expects ipl\\\\Orm\\\\Model\\|null, object given\\.$#" + message: '#^Property ipl\\Orm\\Query\:\:\$count \(int\) does not accept int\|string\|false\|null\.$#' + identifier: assign.propertyType count: 1 path: src/Query.php - - message: "#^Parameter \\#2 \\$model of method ipl\\\\Orm\\\\Resolver\\:\\:qualifyColumnsAndAliases\\(\\) expects ipl\\\\Orm\\\\Model\\|null, object given\\.$#" + message: '#^Property ipl\\Orm\\Query\:\:\$withColumns type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Query.php - - message: "#^Property ipl\\\\Orm\\\\Query\\:\\:\\$columns type has no value type specified in iterable type array\\.$#" + message: '#^Property ipl\\Orm\\Query\:\:\$withoutColumns type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Query.php - - message: "#^Property ipl\\\\Orm\\\\Query\\:\\:\\$count \\(int\\) does not accept int\\|string\\|false\\|null\\.$#" - count: 1 - path: src/Query.php - - - - message: "#^Property ipl\\\\Orm\\\\Query\\:\\:\\$withColumns type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/Query.php - - - - message: "#^Property ipl\\\\Orm\\\\Query\\:\\:\\$withoutColumns type has no value type specified in iterable type array\\.$#" - count: 1 - path: src/Query.php - - - - message: "#^Method ipl\\\\Orm\\\\Relation\\:\\:determineKeys\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Relation\:\:determineKeys\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation.php - - message: "#^Method ipl\\\\Orm\\\\Relation\\:\\:getCandidateKey\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Relation\:\:getCandidateKey\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation.php - - message: "#^Method ipl\\\\Orm\\\\Relation\\:\\:getDefaultCandidateKey\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Relation\:\:getDefaultCandidateKey\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation.php - - message: "#^Method ipl\\\\Orm\\\\Relation\\:\\:getDefaultForeignKey\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Relation\:\:getDefaultForeignKey\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation.php - - message: "#^Method ipl\\\\Orm\\\\Relation\\:\\:getForeignKey\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Relation\:\:getForeignKey\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation.php - - message: "#^Method ipl\\\\Orm\\\\Relation\\:\\:getTarget\\(\\) should return ipl\\\\Orm\\\\Model but returns object\\.$#" + message: '#^Method ipl\\Orm\\Relation\:\:getTarget\(\) should return ipl\\Orm\\Model but returns object\.$#' + identifier: return.type count: 1 path: src/Relation.php - - message: "#^Method ipl\\\\Orm\\\\Relation\\:\\:setCandidateKey\\(\\) has parameter \\$candidateKey with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Relation\:\:setCandidateKey\(\) has parameter \$candidateKey with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation.php - - message: "#^Method ipl\\\\Orm\\\\Relation\\:\\:setForeignKey\\(\\) has parameter \\$foreignKey with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Relation\:\:setForeignKey\(\) has parameter \$foreignKey with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation.php - - message: "#^Property ipl\\\\Orm\\\\Relation\\:\\:\\$candidateKey type has no value type specified in iterable type array\\.$#" + message: '#^Property ipl\\Orm\\Relation\:\:\$candidateKey type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation.php - - message: "#^Property ipl\\\\Orm\\\\Relation\\:\\:\\$foreignKey type has no value type specified in iterable type array\\.$#" + message: '#^Property ipl\\Orm\\Relation\:\:\$foreignKey type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation.php - - message: "#^Property ipl\\\\Orm\\\\Relation\\:\\:\\$target \\(ipl\\\\Orm\\\\Model\\) does not accept object\\.$#" + message: '#^Property ipl\\Orm\\Relation\:\:\$target \(ipl\\Orm\\Model\) does not accept object\.$#' + identifier: assign.propertyType count: 1 path: src/Relation.php - - message: "#^Call to an undefined method object\\:\\:setName\\(\\)\\.$#" + message: '#^Call to an undefined method object\:\:setName\(\)\.$#' + identifier: method.notFound count: 2 path: src/Relation/BelongsToMany.php - - message: "#^Method ipl\\\\Orm\\\\Relation\\\\BelongsToMany\\:\\:extractKey\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Relation\\BelongsToMany\:\:extractKey\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Relation/BelongsToMany.php - - message: "#^Method ipl\\\\Orm\\\\Relation\\\\BelongsToMany\\:\\:extractKey\\(\\) has parameter \\$possibleKey with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Relation\\BelongsToMany\:\:extractKey\(\) has parameter \$possibleKey with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation/BelongsToMany.php - - message: "#^Method ipl\\\\Orm\\\\Relation\\\\BelongsToMany\\:\\:getTargetCandidateKey\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Relation\\BelongsToMany\:\:getTargetCandidateKey\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation/BelongsToMany.php - - message: "#^Method ipl\\\\Orm\\\\Relation\\\\BelongsToMany\\:\\:getTargetForeignKey\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Relation\\BelongsToMany\:\:getTargetForeignKey\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation/BelongsToMany.php - - message: "#^Method ipl\\\\Orm\\\\Relation\\\\BelongsToMany\\:\\:getThrough\\(\\) should return ipl\\\\Orm\\\\Model but returns object\\.$#" + message: '#^Method ipl\\Orm\\Relation\\BelongsToMany\:\:getThrough\(\) should return ipl\\Orm\\Model but returns object\.$#' + identifier: return.type count: 1 path: src/Relation/BelongsToMany.php - - message: "#^Method ipl\\\\Orm\\\\Relation\\\\BelongsToMany\\:\\:setTargetCandidateKey\\(\\) has parameter \\$targetCandidateKey with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Relation\\BelongsToMany\:\:setTargetCandidateKey\(\) has parameter \$targetCandidateKey with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation/BelongsToMany.php - - message: "#^Method ipl\\\\Orm\\\\Relation\\\\BelongsToMany\\:\\:setTargetForeignKey\\(\\) has parameter \\$targetForeignKey with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Relation\\BelongsToMany\:\:setTargetForeignKey\(\) has parameter \$targetForeignKey with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation/BelongsToMany.php - - message: "#^Property ipl\\\\Orm\\\\Relation\\\\BelongsToMany\\:\\:\\$targetCandidateKey type has no value type specified in iterable type array\\.$#" + message: '#^Property ipl\\Orm\\Relation\\BelongsToMany\:\:\$targetCandidateKey type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation/BelongsToMany.php - - message: "#^Property ipl\\\\Orm\\\\Relation\\\\BelongsToMany\\:\\:\\$targetForeignKey type has no value type specified in iterable type array\\.$#" + message: '#^Property ipl\\Orm\\Relation\\BelongsToMany\:\:\$targetForeignKey type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Relation/BelongsToMany.php - - message: "#^Property ipl\\\\Orm\\\\Relation\\\\BelongsToMany\\:\\:\\$through \\(ipl\\\\Orm\\\\Model\\) does not accept object\\.$#" + message: '#^Property ipl\\Orm\\Relation\\BelongsToMany\:\:\$through \(ipl\\Orm\\Model\) does not accept object\.$#' + identifier: assign.propertyType count: 1 path: src/Relation/BelongsToMany.php - - message: "#^Class ipl\\\\Orm\\\\Relations implements generic interface IteratorAggregate but does not specify its types\\: TKey, TValue$#" + message: '#^Class ipl\\Orm\\Relations implements generic interface IteratorAggregate but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 path: src/Relations.php - - message: "#^Method ipl\\\\Orm\\\\Relations\\:\\:assertRelationDoesNotYetExist\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Relations\:\:assertRelationDoesNotYetExist\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Relations.php - - message: "#^Method ipl\\\\Orm\\\\Relations\\:\\:assertRelationExists\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Relations\:\:assertRelationExists\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Relations.php - - message: "#^Method ipl\\\\Orm\\\\ResolvedExpression\\:\\:getColumns\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\ResolvedExpression\:\:getColumns\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/ResolvedExpression.php - - message: "#^Cannot access offset non\\-falsy\\-string on mixed\\.$#" + message: '#^Cannot access offset non\-falsy\-string on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 2 path: src/Resolver.php - - message: "#^Cannot access offset string on mixed\\.$#" + message: '#^Cannot access offset string on mixed\.$#' + identifier: offsetAccess.nonOffsetAccessible count: 5 path: src/Resolver.php - - message: "#^Cannot call method getTarget\\(\\) on mixed\\.$#" + message: '#^Cannot call method getTarget\(\) on mixed\.$#' + identifier: method.nonObject count: 1 path: src/Resolver.php - - message: "#^Cannot call method isOne\\(\\) on mixed\\.$#" + message: '#^Cannot call method isOne\(\) on mixed\.$#' + identifier: method.nonObject count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:collectColumns\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:collectColumns\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:collectMetaData\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:collectMetaData\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:getBehaviors\\(\\) should return ipl\\\\Orm\\\\Behaviors but returns mixed\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:getBehaviors\(\) should return ipl\\Orm\\Behaviors but returns mixed\.$#' + identifier: return.type count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:getColumnDefinitions\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:getColumnDefinitions\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:getColumnDefinitions\\(\\) should return array but returns mixed\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:getColumnDefinitions\(\) should return array but returns mixed\.$#' + identifier: return.type count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:getDefaults\\(\\) return type has no value type specified in iterable type ipl\\\\Orm\\\\Defaults\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:getDefaults\(\) return type has no value type specified in iterable type ipl\\Orm\\Defaults\.$#' + identifier: missingType.iterableValue count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:getDefaults\\(\\) should return ipl\\\\Orm\\\\Defaults but returns mixed\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:getDefaults\(\) should return ipl\\Orm\\Defaults but returns mixed\.$#' + identifier: return.type count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:getRelations\\(\\) should return ipl\\\\Orm\\\\Relations but returns mixed\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:getRelations\(\) should return ipl\\Orm\\Relations but returns mixed\.$#' + identifier: return.type count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:getSelectColumns\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:getSelectColumns\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:getSelectColumns\\(\\) should return array but returns mixed\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:getSelectColumns\(\) should return array but returns mixed\.$#' + identifier: return.type count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:getSelectableColumns\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:getSelectableColumns\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:hasSelectableColumn\\(\\) should return bool but returns mixed\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:hasSelectableColumn\(\) should return bool but returns mixed\.$#' + identifier: return.type count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:qualifyColumns\\(\\) has parameter \\$columns with no value type specified in iterable type iterable\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:qualifyColumns\(\) has parameter \$columns with no value type specified in iterable type iterable\.$#' + identifier: missingType.iterableValue count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:qualifyColumns\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:qualifyColumns\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:qualifyColumnsAndAliases\\(\\) has parameter \\$columns with no value type specified in iterable type iterable\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:qualifyColumnsAndAliases\(\) has parameter \$columns with no value type specified in iterable type iterable\.$#' + identifier: missingType.iterableValue count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:qualifyColumnsAndAliases\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:qualifyColumnsAndAliases\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:requireAndResolveColumns\\(\\) has parameter \\$columns with no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:requireAndResolveColumns\(\) has parameter \$columns with no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/Resolver.php - - message: "#^Method ipl\\\\Orm\\\\Resolver\\:\\:resolveRelation\\(\\) should return ipl\\\\Orm\\\\Relation but returns mixed\\.$#" + message: '#^Method ipl\\Orm\\Resolver\:\:resolveRelation\(\) should return ipl\\Orm\\Relation but returns mixed\.$#' + identifier: return.type count: 1 path: src/Resolver.php - - message: "#^Parameter \\#1 \\$array of function array_keys expects array, mixed given\\.$#" + message: '#^Parameter \#1 \$array of function array_keys expects array, mixed given\.$#' + identifier: argument.type count: 1 path: src/Resolver.php - - message: "#^Property ipl\\\\Orm\\\\Resolver\\:\\:\\$aliases with generic class SplObjectStorage does not specify its types\\: TObject, TData$#" + message: '#^Property ipl\\Orm\\Resolver\:\:\$aliases with generic class SplObjectStorage does not specify its types\: TObject, TData$#' + identifier: missingType.generics count: 1 path: src/Resolver.php - - message: "#^Property ipl\\\\Orm\\\\Resolver\\:\\:\\$behaviors with generic class SplObjectStorage does not specify its types\\: TObject, TData$#" + message: '#^Property ipl\\Orm\\Resolver\:\:\$behaviors with generic class SplObjectStorage does not specify its types\: TObject, TData$#' + identifier: missingType.generics count: 1 path: src/Resolver.php - - message: "#^Property ipl\\\\Orm\\\\Resolver\\:\\:\\$defaults with generic class SplObjectStorage does not specify its types\\: TObject, TData$#" + message: '#^Property ipl\\Orm\\Resolver\:\:\$defaults with generic class SplObjectStorage does not specify its types\: TObject, TData$#' + identifier: missingType.generics count: 1 path: src/Resolver.php - - message: "#^Property ipl\\\\Orm\\\\Resolver\\:\\:\\$metaData with generic class SplObjectStorage does not specify its types\\: TObject, TData$#" + message: '#^Property ipl\\Orm\\Resolver\:\:\$metaData with generic class SplObjectStorage does not specify its types\: TObject, TData$#' + identifier: missingType.generics count: 1 path: src/Resolver.php - - message: "#^Property ipl\\\\Orm\\\\Resolver\\:\\:\\$relations with generic class SplObjectStorage does not specify its types\\: TObject, TData$#" + message: '#^Property ipl\\Orm\\Resolver\:\:\$relations with generic class SplObjectStorage does not specify its types\: TObject, TData$#' + identifier: missingType.generics count: 1 path: src/Resolver.php - - message: "#^Property ipl\\\\Orm\\\\Resolver\\:\\:\\$resolvedRelations with generic class SplObjectStorage does not specify its types\\: TObject, TData$#" + message: '#^Property ipl\\Orm\\Resolver\:\:\$resolvedRelations with generic class SplObjectStorage does not specify its types\: TObject, TData$#' + identifier: missingType.generics count: 1 path: src/Resolver.php - - message: "#^Property ipl\\\\Orm\\\\Resolver\\:\\:\\$selectColumns with generic class SplObjectStorage does not specify its types\\: TObject, TData$#" + message: '#^Property ipl\\Orm\\Resolver\:\:\$selectColumns with generic class SplObjectStorage does not specify its types\: TObject, TData$#' + identifier: missingType.generics count: 1 path: src/Resolver.php - - message: "#^Property ipl\\\\Orm\\\\Resolver\\:\\:\\$selectableColumns with generic class SplObjectStorage does not specify its types\\: TObject, TData$#" + message: '#^Property ipl\\Orm\\Resolver\:\:\$selectableColumns with generic class SplObjectStorage does not specify its types\: TObject, TData$#' + identifier: missingType.generics count: 1 path: src/Resolver.php - - message: "#^Class ipl\\\\Orm\\\\ResultSet implements generic interface Iterator but does not specify its types\\: TKey, TValue$#" + message: '#^Class ipl\\Orm\\ResultSet implements generic interface Iterator but does not specify its types\: TKey, TValue$#' + identifier: missingType.generics count: 1 path: src/ResultSet.php - - message: "#^Method ipl\\\\Orm\\\\ResultSet\\:\\:__construct\\(\\) has parameter \\$limit with no type specified\\.$#" + message: '#^Method ipl\\Orm\\ResultSet\:\:__construct\(\) has parameter \$limit with no type specified\.$#' + identifier: missingType.parameter count: 1 path: src/ResultSet.php - - message: "#^Method ipl\\\\Orm\\\\ResultSet\\:\\:__construct\\(\\) has parameter \\$traversable with no value type specified in iterable type Traversable\\.$#" + message: '#^Method ipl\\Orm\\ResultSet\:\:__construct\(\) has parameter \$traversable with no value type specified in iterable type Traversable\.$#' + identifier: missingType.iterableValue count: 1 path: src/ResultSet.php - - message: "#^Method ipl\\\\Orm\\\\ResultSet\\:\\:advance\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\ResultSet\:\:advance\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/ResultSet.php - - message: "#^Method ipl\\\\Orm\\\\ResultSet\\:\\:hasMore\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\ResultSet\:\:hasMore\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/ResultSet.php - - message: "#^Method ipl\\\\Orm\\\\ResultSet\\:\\:hasResult\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\ResultSet\:\:hasResult\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/ResultSet.php - - message: "#^Method ipl\\\\Orm\\\\ResultSet\\:\\:yieldTraversable\\(\\) has no return type specified\\.$#" + message: '#^Method ipl\\Orm\\ResultSet\:\:yieldTraversable\(\) has no return type specified\.$#' + identifier: missingType.return count: 1 path: src/ResultSet.php - - message: "#^Method ipl\\\\Orm\\\\ResultSet\\:\\:yieldTraversable\\(\\) has parameter \\$traversable with no value type specified in iterable type Traversable\\.$#" + message: '#^Method ipl\\Orm\\ResultSet\:\:yieldTraversable\(\) has parameter \$traversable with no value type specified in iterable type Traversable\.$#' + identifier: missingType.iterableValue count: 1 path: src/ResultSet.php - - message: "#^Property ipl\\\\Orm\\\\ResultSet\\:\\:\\$cache has no type specified\\.$#" + message: '#^Property ipl\\Orm\\ResultSet\:\:\$cache has no type specified\.$#' + identifier: missingType.property count: 1 path: src/ResultSet.php - - message: "#^Property ipl\\\\Orm\\\\ResultSet\\:\\:\\$generator has no type specified\\.$#" + message: '#^Property ipl\\Orm\\ResultSet\:\:\$generator has no type specified\.$#' + identifier: missingType.property count: 1 path: src/ResultSet.php - - message: "#^Property ipl\\\\Orm\\\\ResultSet\\:\\:\\$limit has no type specified\\.$#" + message: '#^Property ipl\\Orm\\ResultSet\:\:\$limit has no type specified\.$#' + identifier: missingType.property count: 1 path: src/ResultSet.php - - message: "#^Property ipl\\\\Orm\\\\ResultSet\\:\\:\\$position has no type specified\\.$#" + message: '#^Property ipl\\Orm\\ResultSet\:\:\$position has no type specified\.$#' + identifier: missingType.property count: 1 path: src/ResultSet.php - - message: "#^Method ipl\\\\Orm\\\\UnionModel\\:\\:getUnions\\(\\) return type has no value type specified in iterable type array\\.$#" + message: '#^Method ipl\\Orm\\UnionModel\:\:getUnions\(\) return type has no value type specified in iterable type array\.$#' + identifier: missingType.iterableValue count: 1 path: src/UnionModel.php - - - - message: "#^Parameter \\#1 \\$model of method ipl\\\\Orm\\\\Query\\:\\:setModel\\(\\) expects ipl\\\\Orm\\\\Model, object given\\.$#" - count: 1 - path: src/UnionQuery.php From be36f282ef23ac066989df4d030d95d8a8f4948a Mon Sep 17 00:00:00 2001 From: Bastian Lederer Date: Thu, 11 Dec 2025 13:12:38 +0100 Subject: [PATCH 4/4] Prevent null from being used as an array key. Since PHP 8.5 using null as array key is deprecated. If used as an array key is converted to an empty string, which is most likely not a valid key in the properties array. --- src/Behavior/Binary.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Behavior/Binary.php b/src/Behavior/Binary.php index 602c9c7..43e3e11 100644 --- a/src/Behavior/Binary.php +++ b/src/Behavior/Binary.php @@ -79,7 +79,7 @@ public function rewriteCondition(Condition $condition, $relation = null) * {@see \ipl\Orm\Compat\FilterProcessor::requireAndResolveFilterColumns()} */ $column = $condition->metaData()->get('columnName'); - if (isset($this->properties[$column])) { + if ($column !== null && isset($this->properties[$column])) { $value = $condition->metaData()->get('originalValue'); if ($this->isPostgres && is_resource($value)) {