protected static function putTestContent() { QC::executeSQL('DROP TABLE IF EXISTS products'); $storagePath = __DIR__ . '/storage/'; $mo = ModelOperator::getInstance($storagePath); $mo->generateBasicStructure('Product'); $ms = new ModelStructure('Product'); $ms->addColumn('id_brand', array('type' => 'int(11) unsigned')); $ms->saveStructure(); $mo->generateAllModelClasses(); $mo->updateDBForAllModels(); require_once $storagePath . 'bases/BaseProduct.php'; require_once $storagePath . 'classes/Product.php'; QC::create('products')->insert(array('title' => 'Macbook air'))->execute(); $testProductFileContent = <<<TEXT <?php class ProductCustom extends BaseProduct { private \$_internalManufacturer = 'solve'; public function getManufacturer() { return \$this->_internalManufacturer; } public function setManufacturer(\$value) { \$this->_internalManufacturer = \$value; return \$this; } } TEXT; file_put_contents($storagePath . 'classes/ProductCustom.php', $testProductFileContent); require_once $storagePath . 'classes/ProductCustom.php'; $mo->setStructureForModel('ProductCustom', $mo->generateBasicStructure('Product', false), false); }
public function setup() { if (!$this->_modelStructure->hasColumn($this->_valueField)) { $this->_modelStructure->addColumn($this->_valueField, array('type' => 'varchar(255)'))->saveStructure(); ModelOperator::getInstance()->updateDBForModel($this->_modelName); } }
/** * Update database and models */ public function updateAllAction() { QC::executeSQL('SET FOREIGN_KEY_CHECKS = 0'); ModelOperator::getInstance(DC::getEnvironment()->getUserClassesRoot() . 'db/')->updateDBForAllModels(); ModelOperator::getInstance()->generateAllModelClasses(); $this->writeln('DB updated'); }
/** * Generates default database model structure */ public function modelAction() { $name = ucfirst(Inflector::camelize($this->getFirstParamOrAsk('Enter model name'))); $path = DC::getEnvironment()->getUserClassesRoot() . 'db/'; $mo = ModelOperator::getInstance($path); if ($mo->getModelStructure($name)) { $this->warning('model ' . $name . ' is already exists', '~ model exists, skipping:'); return true; } $mo->generateBasicStructure($name); $mo->saveModelStructure($name); $this->notify($path . 'structure/' . $name . '.yml', '+ model created'); }
protected static function putTestContent() { QC::executeSQL('SET FOREIGN_KEY_CHECKS = 0'); QC::executeSQL('DROP TABLE IF EXISTS brands'); $storagePath = __DIR__ . '/storage/'; $mo = ModelOperator::getInstance($storagePath); $mo->generateBasicStructure('Brand'); ModelStructure::getInstanceForModel('Brand')->addAbility('slug')->saveStructure(); $mo->generateAllModelClasses(); require_once $storagePath . 'bases/BaseBrand.php'; require_once $storagePath . 'classes/Brand.php'; $mo->updateDBForAllModels(); }
protected static function putTestContent() { QC::executeSQL('SET FOREIGN_KEY_CHECKS = 0'); QC::executeSQL('DROP TABLE IF EXISTS brands'); $storagePath = __DIR__ . '/storage/'; $mo = ModelOperator::getInstance($storagePath); $mo->generateBasicStructure('User'); ModelStructure::getInstanceForModel('User')->dropColumn('title')->addColumn('name', array('type' => 'varchar(255)', 'validation' => array('CustomName' => array('class' => 'Solve\\Database\\Tests\\CustomNameValidationRule', 'error' => 'invalid name')), 'process' => array('trim')))->addColumn('email', array('type' => 'varchar(255)'))->saveStructure(); $mo->generateDataProcessorRules('User'); $mo->generateAllModelClasses(); require_once $storagePath . 'bases/BaseUser.php'; require_once $storagePath . 'classes/User.php'; $mo->updateDBForAllModels(); }
protected static function putTestContent() { QC::executeSQL('DROP TABLE IF EXISTS products'); $storagePath = __DIR__ . '/storage/'; $mo = ModelOperator::getInstance($storagePath); $mo->generateBasicStructure('Product'); $ms = new ModelStructure('Product'); $ms->addColumn('info', array('type' => 'array')); $ms->saveStructure(); $mo->generateAllModelClasses(); $mo->updateDBForAllModels(); require_once $storagePath . 'bases/BaseProduct.php'; require_once $storagePath . 'classes/Product.php'; QC::create('products')->insert(array('title' => 'Macbook air'))->execute(); }
protected static function putTestContent() { QC::executeSQL('SET FOREIGN_KEY_CHECKS = 0'); QC::executeSQL('DROP TABLE IF EXISTS brands'); $storagePath = __DIR__ . '/storage/'; $mo = ModelOperator::getInstance($storagePath); $mo->generateBasicStructure('Brand'); ModelStructure::getInstanceForModel('Brand')->addAbility('files', array('logo' => array('name' => 'original', 'multiple' => true), 'info' => array(), 'avatar' => array('sizes' => array('small' => array('size' => '100x100', 'method' => 'fitOut')))))->saveStructure(); $mo->generateAllModelClasses(); require_once $storagePath . 'bases/BaseBrand.php'; require_once $storagePath . 'classes/Brand.php'; $webRoot = __DIR__ . '/upload/'; FilesAbility::setBaseStoreLocation($webRoot); FSService::setWebRoot($webRoot); FSService::unlinkRecursive($webRoot); $mo->updateDBForAllModels(); }
public function onKernelReady(BaseEvent $event) { $this->onEnvironmentUpdate($event); if ($webRoot = DC::getProjectConfig('webRoot')) { DC::getEnvironment()->setWebRoot($webRoot); } $databaseConfig = DC::getDatabaseConfig(); $request = DC::getRouter()->getCurrentRequest(); if ($profiles = $databaseConfig->get('profiles')) { foreach ($profiles as $profileName => $profileInfo) { DatabaseService::configProfile($profileInfo, $profileName); } if (empty($request) || $request && !$request->isConsoleRequest()) { ModelOperator::getInstance(DC::getEnvironment()->getUserClassesRoot() . 'db/'); if ($databaseConfig->get('autoUpdateAll')) { ModelOperator::getInstance()->generateAllModelClasses()->updateDBForAllModels(); } } } }
protected static function putTestContent() { QC::executeSQL('SET FOREIGN_KEY_CHECKS = 0'); QC::executeSQL('DROP TABLE IF EXISTS products'); QC::executeSQL('DROP TABLE IF EXISTS brands'); QC::executeSQL('DROP TABLE IF EXISTS brands_translate'); $storagePath = __DIR__ . '/storage/'; $mo = ModelOperator::getInstance($storagePath); $mo->generateBasicStructure('Product'); $mo->generateBasicStructure('Brand'); ModelStructure::getInstanceForModel('Product')->addColumn('id_brand', array('type' => 'int(11) unsigned'))->addRelation('brand')->saveStructure(); ModelStructure::getInstanceForModel('Brand')->addRelation('products')->addAbility('translate', array('columns' => array('title')))->saveStructure(); $mo->generateAllModelClasses(); require_once $storagePath . 'bases/BaseProduct.php'; require_once $storagePath . 'bases/BaseBrand.php'; require_once $storagePath . 'classes/Product.php'; require_once $storagePath . 'classes/Brand.php'; ModelOperator::getAbilityInstanceForModel('Brand', 'Translate')->cleanup(); $mo->updateDBForAllModels(); }
public function testBasic() { $mo = ModelOperator::getInstance(self::$_storagePath); $this->assertEmpty($mo->getModelStructure('User'), 'Empty structure returns array()'); $mo->generateBasicStructure('User'); $data = $mo->getModelStructure('User'); $this->assertEquals(array('table' => 'users', 'columns' => array('id' => array('type' => 'int(11) unsigned', 'auto_increment' => true), 'title' => array('type' => 'varchar(255)')), 'indexes' => array('primary' => array('columns' => array('id')))), $data, 'Basic structure generator is ok'); $mo->saveModelStructure('User'); $this->assertFileExists(self::$_storagePath . 'structure/User.yml', 'Save model structure is ok'); $mo->generateModelClass('User'); require_once __DIR__ . '/storage/bases/BaseUser.php'; require_once __DIR__ . '/storage/classes/User.php'; $this->assertFileExists(self::$_storagePath . 'bases/BaseUser.php', 'BaseModel generated'); $this->assertFileExists(self::$_storagePath . 'classes/User.php', 'Model generated'); $this->assertTrue(class_exists('\\User'), 'Generated model class is available'); QC::executeSQL('DROP TABLE IF EXISTS users'); $mo->updateDBForModel('User'); $data = DBOperator::getInstance()->getTableStructure('users'); $this->assertNotEmpty($data, 'Table generation is ok'); }
protected static function putTestContent() { QC::executeSQL('DROP TABLE IF EXISTS products'); QC::executeSQL('DROP TABLE IF EXISTS categories'); $storagePath = __DIR__ . '/storage/'; $mo = ModelOperator::getInstance($storagePath); $mo->generateBasicStructure('Product'); $mo->generateBasicStructure('Category'); ModelStructure::getInstanceForModel('Product')->addColumn('id_category', array('type' => 'int(11) unsigned'))->addRelation('category')->addRelation('category_title', array('table' => 'categories', 'fields' => array('title'), 'use' => 'title', 'type' => 'many_to_one', 'local_field' => 'id_category'))->saveStructure(); ModelStructure::getInstanceForModel('Category')->addRelation('products')->saveStructure(); $mo->generateAllModelClasses(); require_once $storagePath . 'bases/BaseProduct.php'; require_once $storagePath . 'bases/BaseCategory.php'; require_once $storagePath . 'classes/Product.php'; require_once $storagePath . 'classes/Category.php'; $mo->updateDBForAllModels(); QC::create('products')->insert(array('title' => 'Macbook Air', 'id_category' => 1))->execute(); QC::create('products')->insert(array('title' => 'Macbook Pro', 'id_category' => 1))->execute(); QC::create('products')->insert(array('title' => 'iMac 27"', 'id_category' => 2))->execute(); QC::create('categories')->insert(array('title' => 'Notebooks'))->execute(); QC::create('categories')->insert(array('title' => 'Computers'))->execute(); $categoriesCollectionText = <<<TEXT <?php use Solve\\Database\\Models\\ModelCollection; class CategoriesCollection extends ModelCollection { public function getProductsCount() { return 12; } } TEXT; file_put_contents($storagePath . 'classes/CategoriesCollection.php', $categoriesCollectionText); require_once $storagePath . 'classes/CategoriesCollection.php'; }
public function setupAddedAbilities() { if (empty($this->_addedAbilities)) { return $this; } foreach ($this->_addedAbilities as $abilityName) { $instance = ModelOperator::getAbilityInstanceForModel($this->_modelName, $abilityName); $instance->setup(); } $this->_addedAbilities = array(); return $this; }
public static function __callStatic($method, $params) { if ($methodInfo = ModelOperator::getStaticAbilityMethod(get_called_class(), $method)) { return $methodInfo['ability']->{$method}($params); } throw new \Exception('Undefined static method for model: ' . $method); }
public function preDelete($caller) { $ids = ModelOperator::getIDs($caller); QC::create($this->_tableName)->delete(array('id_object' => $ids))->execute(); }
/** * Updates relations in database * @param string $modelName * @param mixed $structure * @throws \Exception */ public function updateDBRelations($modelName, $structure) { if (empty($structure['relations'])) { return true; } foreach ($structure['relations'] as $relationName => $relationInfo) { $info = ModelOperator::calculateRelationVariables($modelName, $relationName); switch ($info['relationType']) { case 'many_to_many': $this->updateManyTable($info); break; case 'many_to_one': break; case 'one_to_many': break; } } }
/** * @param Model|ModelCollection $caller * @param $relationName * @return $this * @throws \Exception */ public function _loadRelated($caller, $relationName) { /** * @var $localKey * @var $localField * @var $foreignKey * @var $foreignField * @var $localTable * @var $foreignTable * @var $manyTable * @var $relationType * @var $relatedModelName * @var $hydration * @var $fieldsToRetrieve * @var $relationToMany */ $varsToExport = ModelOperator::calculateRelationVariables($caller->_getName(), $relationName); extract($varsToExport); $foreignIds = array(); $idsMap = array(); $originalCaller = null; if ($caller instanceof Model && $caller->_hasCollectionReference()) { $caller = $caller->_getCollectionReference(); } if ($relationType == 'many_to_one') { $foreignIds = ModelOperator::getFieldArray($caller, $localField); } elseif ($relationToMany) { $localIds = ModelOperator::getIDs($caller); $tableToSelect = $foreignTable; $fieldToSelect = $foreignKey; if ($relationType == 'many_to_many') { $tableToSelect = $manyTable; $fieldToSelect = $localField; } $idsMap = QC::create($tableToSelect)->where(array($tableToSelect . '.' . $foreignField => $localIds))->select($fieldToSelect . ', ' . $foreignField)->foldBy($foreignField)->use($fieldToSelect)->execute(); foreach ($idsMap as $value) { $foreignIds = array_merge($foreignIds, $value); } } $foreignIds = array_unique($foreignIds); if (empty($foreignIds)) { return false; } elseif ($foreignKey == 'id') { $ids = array(); foreach ($foreignIds as $key => $value) { $ids[] = intval($value); } $foreignIds = $ids; } /** * @var ModelCollection $relatedCollection */ $relatedCollection = call_user_func(array($relatedModelName, 'loadList'), $foreignIds); $callerObjects = $caller instanceof ModelCollection ? $caller : array($caller); /** * @var Model $object */ foreach ($callerObjects as $object) { if (substr($relationType, '-6') == 'to_one') { $relationValue = $relatedCollection->getOneByPK($object[$localField]); } else { $relationValue = $relatedCollection->getSubCollectionByPKs($idsMap[$object->getID()]); } $object->_setRawFieldValue($relationName, $relationValue); } return $this; }
public static function configureStaticInstance($storagePath) { self::$_instance = new ModelOperator($storagePath); self::$_instance->loadStructureFiles(); }
public function __call($method, $params) { if (substr($method, -10) == 'RelatedIDs') { ModelRelation::getInstanceForModel($this)->{$method}($this, $params[0], $params[1]); } elseif (substr($method, 0, 10) == 'setRelated') { ModelRelation::getInstanceForModel($this)->setRelatedIDs($this, substr($method, 10), $params[0]); } elseif (substr($method, 0, 12) == 'clearRelated') { ModelRelation::getInstanceForModel($this)->clearRelatedIDs($this, substr($method, 12), $params[0]); } elseif (in_array($method, $this->_modelsMethods)) { foreach ($this->_data as $object) { /** * @var Model $object */ call_user_func_array(array($object, $method), $params); } } elseif ($methodInfo = ModelOperator::getInstanceAbilityMethod($this->_modelClass, $method)) { array_unshift($params, $this); return call_user_func_array(array($methodInfo['ability'], $method), $params); } return $this; }