phpstan-doctrine icon indicating copy to clipboard operation
phpstan-doctrine copied to clipboard

Error in TablePrefixSubscriber doctrine/orm v2.13.1

Open petrparolek opened this issue 2 years ago • 0 comments

Package versions:

doctrine/orm                                   2.13.1
phpstan/phpstan                                1.8.2
phpstan/phpstan-deprecation-rules              1.0.0
phpstan/phpstan-doctrine                       1.3.12
phpstan/phpstan-nette                          1.0.0
phpstan/phpstan-strict-rules                   1.3.0

version doctrine/orm 2.12.3 was OK.

I write code like this https://www.doctrine-project.org/projects/doctrine-orm/en/2.13/cookbook/sql-table-prefixes.html#sql-table-prefixes .

Code:

<?php declare(strict_types = 1);

namespace App\Model;

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\LoadClassMetadataEventArgs;
use Doctrine\ORM\Mapping\ClassMetadata;

final class TablePrefixSubscriber implements EventSubscriber
{

	public function __construct(public string $prefix)
	{
	}

	/**
	 * @return array<string>
	 */
	public function getSubscribedEvents(): array
	{
		return ['loadClassMetadata'];
	}

	public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs): void
	{
		$classMetadata = $eventArgs->getClassMetadata();

		if (!$classMetadata->isInheritanceTypeSingleTable() || $classMetadata->getName() === $classMetadata->rootEntityName) {
			$classMetadata->setPrimaryTable([
				'name' => $this->prefix . $classMetadata->getTableName()
			]);
		}

		foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) {
			if ($mapping['type'] == ClassMetadata::MANY_TO_MANY && $mapping['isOwningSide']) {
				$mappedTableName = $mapping['joinTable']['name']; //here is reported error by PHPStan
				$classMetadata->associationMappings[$fieldName]['joinTable']['name'] = $this->prefix . $mappedTableName;
			}
		}
	}

}

Error:

 ------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
  Line   app/Model/TablePrefixSubscriber.php                                                                                                                                       
 ------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
  36     Offset 'joinTable' does not exist on array{cache?: array, cascade: array<string>, declared?: class-string, fetch: mixed, fieldName: string, id?: bool, inherited?: class-string,  
         indexBy?: string, ...}.                                                                                                                                                           
 ------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

petrparolek avatar Aug 10 '22 16:08 petrparolek