Example #1
0
 protected function getModels($module = null)
 {
     $checkModule = $module !== null;
     $models = [];
     $modelFiles = glob(Alias::get('Modules') . '/*/Models/*.php');
     foreach (Alias::find('Contrib.*') as $alias) {
         $contribModels = glob($alias . '/*/Models/*.php');
         if ($contribModels) {
             $modelFiles = array_merge($modelFiles, $contribModels);
         }
     }
     $modules = [];
     foreach ($modelFiles as $file) {
         $moduleName = basename(dirname(dirname($file)));
         if ($checkModule && $module == $moduleName && Mindy::app()->hasModule($moduleName) || !$checkModule && Mindy::app()->hasModule($moduleName)) {
             $modules[] = $moduleName;
             $class = str_replace('.php', '', substr($file, strpos($file, 'Modules')));
             $class = str_replace('/', '\\', $class);
             if (is_subclass_of($class, Model::className())) {
                 $reflectClass = new ReflectionClass($class);
                 if ($reflectClass->isAbstract()) {
                     continue;
                 }
                 $models[$class] = new $class();
             }
         }
     }
     echo "Modules:" . PHP_EOL;
     echo implode(PHP_EOL, array_unique($modules)) . PHP_EOL;
     return $models;
 }
Example #2
0
 /**
  * Example:
  * >>> $user = User::objects()->get(['pk' => 1]);
  * >>> $pages = Page::object()->filter(['user__in' => [$user]])->all();
  * @param array $query
  * @param bool $aliased
  * @throws \Mindy\Exception\Exception
  * @return array
  */
 protected function parseLookup(array $query, $aliased = true, $autoGroup = true)
 {
     $queryBuilder = $this->getQueryBuilder();
     $lookupQuery = [];
     $lookupParams = [];
     $resultQuery = [];
     foreach ($query as $key => $queryItem) {
         if ($queryItem instanceof Q) {
             $queryCondition = $queryItem->getQueryCondition();
             $expressionQueryJoin = $queryItem->getQueryJoinCondition();
             $expressionConditionGroups = $queryItem->getConditions();
             $expressionParams = [];
             $expressionQuery = [];
             foreach ($expressionConditionGroups as $expressionConditions) {
                 list($conditionQuery, $conditionParams) = $this->parseLookup($expressionConditions, $aliased, $autoGroup);
                 $expressionQuery[] = array_merge($expressionQueryJoin, $conditionQuery);
                 $expressionParams = array_merge($expressionParams, $conditionParams);
             }
             $lookupParams = array_merge($lookupParams, $expressionParams);
             $lookupQuery[] = array_merge($queryCondition, $expressionQuery);
         } else {
             $resultQuery[$key] = $queryItem;
         }
     }
     $query = $resultQuery;
     $lookup = new LookupBuilder($query);
     foreach ($lookup->parse() as $data) {
         list($prefix, $field, $condition, $params) = $data;
         /** @var Model $model */
         list($alias, $model) = $this->getOrCreateChainAlias($prefix, false, $autoGroup);
         if ($field === 'pk') {
             $field = $model->getPkName();
         }
         if (is_object($params) && ($params instanceof QuerySet || $params instanceof Manager)) {
             if ($condition != 'in') {
                 throw new Exception("QuerySet object can be used as a parameter only in case of 'in' condition");
             } else {
                 if ($params instanceof Manager) {
                     $params = $params->getQuerySet();
                 }
                 $params->prepareConditions();
             }
         }
         // https://github.com/studio107/Mindy_Orm/issues/26
         if ($model->hasField($field)) {
             if ($condition == 'in' || $condition == 'exact') {
                 $initField = $model->getField($field);
                 if (is_a($initField, $model::$foreignField)) {
                     $initFieldModelClass = $initField->modelClass;
                     $field .= '_' . $initFieldModelClass::primaryKeyName();
                     // https://github.com/studio107/Mindy_Orm/issues/29
                     if ($condition == 'exact') {
                         if (is_a($params, Model::className())) {
                             $params = $params->pk;
                         }
                     }
                 }
             }
         }
         if ($aliased === true || is_string($aliased)) {
             if (strpos($field, '.') === false) {
                 if (is_string($aliased)) {
                     $field = $aliased . '.' . $field;
                 } else {
                     if ($alias) {
                         $field = $alias . '.' . $field;
                     }
                 }
             }
         }
         $method = 'build' . ucfirst($condition);
         if (method_exists($this, $method)) {
             list($query, $params) = $this->{$method}($field, $params);
         } else {
             list($query, $params) = $queryBuilder->{$method}($field, $params);
         }
         $lookupParams = array_merge($lookupParams, $params);
         $lookupQuery[] = $query;
     }
     return [$lookupQuery, $lookupParams];
 }