Ejemplo n.º 1
0
 /**
  * load the query object for a hasManyToMany relationship
  * build most of the joins manually since by reference relationship in the model isn't working so well
  * this support joins to distant tables with parent models
  *
  * @param Relation|PhalconRelation $relation
  * @return array
  */
 protected function getHasManyToManyRecords($relation)
 {
     $refModelNameSpace = $relation->getReferencedModel();
     $intermediateModelNameSpace = $relation->getIntermediateModel();
     // determine the key to search against
     $field = $relation->getFields();
     $referencedField = $relation->getReferencedFields();
     $intermediateFields = $relation->getIntermediateReferencedFields();
     $config = $this->getDI()->get('config');
     $modelNameSpace = $config['namespaces']['models'];
     $mm = $this->getDI()->get('modelsManager');
     /** @var Builder $query */
     $query = $mm->createBuilder()->from($intermediateModelNameSpace)->join($refModelNameSpace, $refModelNameSpace . ".{$referencedField} = " . $intermediateModelNameSpace . ".{$intermediateFields}");
     $columns = array();
     // join in parent record if one is detected
     $parentName = $relation->getParent();
     if ($parentName) {
         // load parent model
         /** @var BaseModel $parentModel */
         $parentModelNameSpace = $modelNameSpace . $parentName;
         $parentModel = new $refModelNameSpace();
         // load reference relationship
         $parentRelationship = $parentModel->getRelation($parentName);
         $columns[] = "{$parentModelNameSpace}.*";
         $query->join($parentModelNameSpace, "{$parentModelNameSpace}." . $parentRelationship->getReferencedFields() . " = {$refModelNameSpace}." . $parentRelationship->getFields(), $parentModelNameSpace);
     }
     // Load the main record field at the end, so they are not overwritten
     $columns[] = $refModelNameSpace . ".*, " . $intermediateModelNameSpace . ".*";
     $query->columns($columns);
     if (isset($this->baseRecord[$field])) {
         $fieldValue = $this->baseRecord[$field];
     } else {
         // fall back to using the primaryKeyValue
         $fieldValue = $this->primaryKeyValue;
     }
     $whereField = $intermediateModelNameSpace . '.' . $relation->getIntermediateFields();
     $query->where("{$whereField} = \"{$fieldValue}\"");
     $result = $query->getQuery()->execute();
     return $this->loadRelationRecords($result, $relation);
 }