Nextras ORM fetchPairs(‚some_id‘, NULL) – Nextras\Orm\Repository::hydrateEntity() must be of the type array

Čamo
Člen | 786
+
+1
-

Zdravím,
mám dojem, že som narazil na bug, alebo to nesprávne používam. Ide o metódu, ktorá je implementovaná v repozitory cez mapper.

/**
 * Class SurveyAnswersRepository
 * @method ICollection|SurveyAnswer[] findSurveysAnswersForFilterSurveysForm( $surveyDef, $conditions )
 */
class SurveyAnswersRepository extends BaseRepository
...

Metoda findSurveysAnswersForFilterSurveysForm() pracuje s queryBuilderom a vyzerá asi takto

class SurveyAnswersMapper extends BaseMapper
{

	public function findSurveysAnswersForFilterSurveysForm( SurveyDef $surveyDef, array $conditions )
	{
		$builder = $this->builder();
		...
		$result = $this->connection->queryArgs( $builder->getQuerySql(), $builder->getQueryParameters() );
		return $result->fetchPairs('survey_def_question', NULL);
	}
}

Keď testujem čo mi vráti fetchPairs() tak vidím správne pole $id => $row. Ale ORM sa hneď po fetchPairs() snaží namapovať výsledok na ICollection a zavolá DbalMapper::toCollection() kde to padne na volaní

$result = array_map([$this->getRepository(), 'hydrateEntity'], $data);

pretože fetchPairs(‚id‘, NULL) vracia pole inštancíí Nextras\Dbal\Result\Row a hydrateEntity(array $data) očakáva array. Vie niekto v čom je problém?

Díky.

Editoval Čamo (25. 10. 2017 11:20)

David Matějka
Moderator | 6445
+
+2
-

Ahoj, tohle je ocekavane chovani nextras orm 2

kdyz pouzivas proxy metody z repository na mapper (tzn ty magicke @method), tak se nextras snazi ten vysledek prevest na pole entit. resenim je nepouzit @method, ale implementovat v repo klasicky metodu a na mapper to preposlat rucne:

public function findSurveysAnswersForFilterSurveysForm(...)
{
	return $this->getMapper()->findSurveysAnswersForFilterSurveysForm(.....);
}

v nextras orm 3 (ktere je ted v nejake beta fazi) doslo ke zmene a na automatickou konverzi na kolekci nedochazi. (to vsak ma za nasledek, ze jiz z mapperu musis vracet kolekci)

Čamo
Člen | 786
+
0
-

@DavidMatějka Díky to bola luxusná odpoveď. Funguje to.