public function read($model, $name, &$dbValue, $transformatorClass = TransformatorInterface::class) { $fieldMeta = ManganMeta::create($model)->field($name); $relMeta = $fieldMeta->related; $relModel = new $relMeta->class(); $criteria = new Criteria(null, $relModel); if (empty($relMeta->join)) { throw new InvalidArgumentException(sprintf('Parameter `join` is required for Related annotation, model `%s`, field `%s`', get_class($model), $name)); } foreach ($relMeta->join as $source => $rel) { assert($model->{$source} !== null); $criteria->addCond($rel, '==', $model->{$source}); } $criteria->setSort(new Sort($relMeta->sort)); if ($relMeta->single) { $model->{$name} = (new Finder($relModel))->find($criteria); } else { $model->{$name} = (new Finder($relModel))->findAll($criteria); } }