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: * >>> $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]; }