. * * @author Daniil Gentili * @author Alexander Pankratov * @copyright 2016-2024 Daniil Gentili * @copyright 2016-2024 Alexander Pankratov * @license https://opensource.org/licenses/AGPL-3.0 AGPLv3 * @link https://daniil.it/AsyncOrm AsyncOrm documentation */ namespace danog\AsyncOrm; use danog\AsyncOrm\Annotations\OrmMappedArray; use danog\AsyncOrm\Internal\DbPropertiesFactory; use ReflectionClass; use function Amp\async; use function Amp\Future\await; /** * Include this trait and call DbPropertiesTrait::initDb to use AsyncOrm's database backend for properties marked by the OrmMappedArray property. */ trait DbPropertiesTrait { /** * Initialize database instance. * * @internal */ public function initDb(Settings $dbSettings): void { $prefix = $this->getDbPrefix(); $className = \explode('\\', static::class); $className = \end($className); $promises = []; foreach ((new ReflectionClass(static::class))->getProperties() as $property) { $attr = $property->getAttributes(OrmMappedArray::class); if (!$attr) { continue; } $attr = $attr[0]->newInstance(); $table = $prefix.'_'; $table .= $attr->table ?? "{$className}_{$property}"; $promises[$property] = async(DbPropertiesFactory::get(...), $dbSettings, $table, $attr, $this->{$property} ?? null); } $promises = await($promises); foreach ($promises as $key => $data) { $this->{$key} = $data; } } /** * Returns the prefix to use for table names. */ protected function getTablePrefix(): string { return ''; } }