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); }
/** * 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'); }
public static function setUpBeforeClass() { DatabaseService::configProfile(array('Product' => 'root', 'pass' => 'root')); self::$_storagePath = __DIR__ . '/storage/'; DBOperator::getInstance()->dropDB(self::$_DBName)->createDB(self::$_DBName)->useDB(self::$_DBName); FSService::unlinkRecursive(self::$_storagePath); QC::executeSQL('SET FOREIGN_KEY_CHECKS = 0'); call_user_func(array(get_called_class(), 'putTestContent')); }
public function setUp() { DatabaseService::configProfile(array('user' => 'root', 'pass' => 'root')); $DBName = 'solve_test_database'; DBOperator::getInstance()->createDB($DBName)->useDB($DBName); QC::executeSQL('DROP TABLE IF EXISTS users'); DBOperator::getInstance()->createTable('users', array('table' => 'users', 'columns' => array('id' => array('type' => 'int(11) unsigned', 'auto_increment' => true), 'position' => 'varchar(255)', 'age' => 'tinyint(1) unsigned', 'name' => 'varchar(255)'), 'indexes' => array('id' => array('type' => 'primary', 'columns' => 'id')))); QC::executeSQL('TRUNCATE `users`'); }
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(); }
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'; }
/** * Updates many to many tables * @param $info * @return mixed */ public function updateManyTable($info) { $structure = array('table' => $info['manyTable'], 'columns' => array(), 'indexes' => array(), 'constraints' => array()); $localName = Inflector::singularize($info['localTable']); $foreignName = Inflector::singularize($info['foreignTable']); $structure['columns']['id'] = array('type' => 'int(11) unsigned', 'auto_increment' => true); $structure['columns']['id_' . $localName] = 'int(11) unsigned'; $structure['columns']['id_' . $foreignName] = 'int(11) unsigned'; $structure['indexes']['primary'] = array('columns' => array('id'), 'type' => 'primary'); $structure['indexes']['unique_id_' . $localName . '_id_' . $foreignName] = array('columns' => array('id_' . $localName, 'id_' . $foreignName), 'type' => 'unique'); $foreignKeysInfo = array('local_table' => $info['manyTable'], 'foreign_table' => $info['localTable'], 'local_field' => 'id_' . $localName, 'foreign_field' => $info['foreignKey']); $structure['constraints'][$this->generateForeignKeyName($foreignKeysInfo)] = $foreignKeysInfo; $foreignKeysInfo = array('local_table' => $info['manyTable'], 'foreign_table' => $info['foreignTable'], 'local_field' => 'id_' . $foreignName, 'foreign_field' => $info['foreignKey']); $structure['constraints'][$this->generateForeignKeyName($foreignKeysInfo)] = $foreignKeysInfo; $diffs = $this->getDifferenceSQL($structure, $info['manyTable']); if ($diffs['result'] === true) { QC::executeSQL('SET FOREIGN_KEY_CHECKS = 0'); if (!empty($diffs['sql']['ADD'])) { try { QC::executeArrayOfSQL($diffs['sql']['ADD']); } catch (\Exception $e) { var_dump($e->getMessage()); die; } } } return $diffs['result']; }
/** * Load data from YML files into database with replacing * @param string|array $models */ public function dataLoad($models = null) { if (!empty($models)) { if (!is_array($models)) { $models = array($models); } } else { $models = array_keys($this->_structures); } $data_dir = $this->_storagePath . 'data/'; foreach ($models as $model) { $model = ucfirst($model); $file_name = $data_dir . strtolower($model) . '.yml'; if (!isset($this->_structures[$model]) || !is_file($file_name)) { continue; } $data = Yaml::parse(file_get_contents($file_name)); if (!is_array($data)) { continue; } QC::executeSQL('SET FOREIGN_KEY_CHECKS=0'); QC::executeSQL('TRUNCATE `' . $this->_structures[$model]['table'] . '`'); QC::create($this->_structures[$model]['table'])->insert($data)->execute(); } }