/** * Get base query * @return Builder */ public function query() { $query = new Builder(null); $query->setDI($this->di); $query->from($this->class); $manager = $this->model()->getModelsManager(); /** @var RelationInterface[] $belongsToRelations */ $belongsToRelations = $manager->getBelongsTo($this->model()); if (!empty($belongsToRelations)) { foreach ($belongsToRelations as $belongsToRelation) { $referencedModel = $belongsToRelation->getReferencedModel(); $referencedField = $belongsToRelation->getReferencedFields(); $field = $belongsToRelation->getFields(); $alias = $belongsToRelation->getOptions()['alias']; $query->innerJoin($referencedModel, "{$alias}.{$referencedField} = {$this->class}.{$field}", $alias); } } /** @var RelationInterface[] $hasManyRelations */ $hasManyRelations = $manager->getHasMany($this->model()); if (!empty($hasManyRelations)) { foreach ($hasManyRelations as $hasManyRelation) { $referencedModel = $hasManyRelation->getReferencedModel(); $referencedField = $hasManyRelation->getReferencedFields(); $field = $hasManyRelation->getFields(); $alias = $hasManyRelation->getOptions()['alias']; $query->leftJoin($referencedModel, "{$alias}.{$referencedField} = {$this->class}.{$field}", $alias); $query->groupBy("{$this->class}.id"); } } return $query; }