Exemple #1
0
    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);
    }
Exemple #2
0
 public function setup()
 {
     if (!$this->_modelStructure->hasColumn($this->_valueField)) {
         $this->_modelStructure->addColumn($this->_valueField, array('type' => 'varchar(255)'))->saveStructure();
         ModelOperator::getInstance()->updateDBForModel($this->_modelName);
     }
 }
Exemple #3
0
 /**
  * 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');
 }
Exemple #4
0
 /**
  * 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();
 }
Exemple #7
0
 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();
 }
Exemple #9
0
 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();
 }
Exemple #11
0
 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';
    }
Exemple #13
0
 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;
 }
Exemple #14
0
 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);
 }
Exemple #15
0
 public function preDelete($caller)
 {
     $ids = ModelOperator::getIDs($caller);
     QC::create($this->_tableName)->delete(array('id_object' => $ids))->execute();
 }
Exemple #16
0
 /**
  * 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;
         }
     }
 }
Exemple #17
0
 /**
  * @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;
 }
Exemple #18
0
 public static function configureStaticInstance($storagePath)
 {
     self::$_instance = new ModelOperator($storagePath);
     self::$_instance->loadStructureFiles();
 }
Exemple #19
0
 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;
 }