/** * Adds a join clause to the current relatedQuery using the relation Object. * * @param \Illuminate\Database\Query $query * @param \Illuminate\Database\Eloquent\Relations\Relation $relation * @return \Illuminate\Database\Querys */ protected function joinRelated($query, $relation) { $parentTable = $relation->getParent()->getTable(); $parentKey = $relation->getParent()->getKeyName(); $relatedTable = $relation->getRelated()->getTable(); $fk = $relation->getForeignKey(); $relationType = str_replace('Illuminate\\Database\\Eloquent\\Relations\\', '', get_class($relation)); switch ($relationType) { case 'BelongsTo': $query->join($relatedTable, "{$relatedTable}.{$parentKey}", '=', "{$parentTable}.{$fk}"); break; case 'HasOne': case 'HasMany': case 'MorphOne': case 'MorphMany': $query->join($relatedTable, "{$parentTable}.{$parentKey}", '=', "{$fk}"); break; case 'BelongsToMany': $table = $relation->getTable(); $otherKey = $relation->getOtherKey(); $query->join($table, "{$parentTable}.{$parentKey}", '=', "{$fk}")->join($relatedTable, "{$relatedTable}.{$parentKey}", '=', "{$otherKey}"); break; default: break; } return $query; }
/** * @param $joinTableAlias * @param $currentTableAlias * @param BelongsTo|Relation $relation * @param string $columnsPrefix */ protected function addJoinToQuery($joinTableAlias, $currentTableAlias, Relation $relation, $columnsPrefix = '') { $joinTableName = $relation->getRelated()->getTable(); $joinTable = implode(' as ', [$joinTableName, $joinTableAlias]); $joinLeftCondition = implode('.', [$joinTableAlias, $relation->getOtherKey()]); $joinRightCondition = implode('.', [$currentTableAlias, $relation->getForeignKey()]); $this->query->leftJoin($joinTable, $joinLeftCondition, '=', $joinRightCondition); $columns = $this->getColumns($joinTableName); $prefix = static::$prefix . $columnsPrefix . $joinTableAlias . '---'; foreach ($columns as $column) { $this->selectFromQuery($joinTableAlias, $column, $prefix . $column); } }
/** * Get the keys from relation in order to join the table. * * @param \Illuminate\Database\Eloquent\Relations\Relation $relation * @return array * * @throws \LogicException */ protected function getJoinKeys(Relation $relation) { if ($relation instanceof HasOne || $relation instanceof MorphOne) { return [$relation->getForeignKey(), $relation->getQualifiedParentKeyName()]; } if ($relation instanceof BelongsTo && !$relation instanceof MorphTo) { return [$relation->getQualifiedForeignKey(), $relation->getQualifiedOtherKeyName()]; } $class = get_class($relation); throw new LogicException("Only HasOne, MorphOne and BelongsTo mappings can be queried. {$class} given."); }
/** * Parse the fixture data for belongsToManyRecord. * The current syntax allows for pivot data to be provided * via a pipe delimiter with colon separated key values. * <code> * 'Travis' => [ * 'first_name' => 'Travis', * 'last_name' => 'Bennett', * 'roles' => 'endUser|foo:bar, root' * ] * </code> * * @param string $recordName The name of the relation the fixture is defined on (e.g Travis). * @param Relation $relation The relationship oject (should be of type belongsToMany). * @param string $relatedRecord The related record data (e.g endUser|foo:bar or root). * @return array */ protected function buildBelongsToManyRecord($recordName, Relation $relation, $relatedRecord) { $pivotColumns = explode('|', $relatedRecord); $relatedRecordName = array_shift($pivotColumns); $foreignKeyPieces = explode('.', $relation->getForeignKey()); $foreignKeyName = $foreignKeyPieces[1]; $foreignKeyValue = $this->generateKey($recordName); $otherKeyPieces = explode('.', $relation->getOtherKey()); $otherKeyName = $otherKeyPieces[1]; $otherKeyValue = $this->generateKey($relatedRecordName); $fields = "{$foreignKeyName}, {$otherKeyName}"; $values = array($foreignKeyValue, $otherKeyValue); foreach ($pivotColumns as $pivotColumn) { list($columnName, $columnValue) = explode(':', $pivotColumn); $fields .= ", {$columnName}"; $values[] = $columnValue; } return array($fields, $values); }
/** * Build join parameters. * * @param Relation $relation * @return array */ protected function joinParameters(Relation $relation) { return [$relation->getRelated()->getTable(), $relation->getQualifiedParentKeyName(), '=', $relation->getForeignKey()]; }
/** * Get pair of the keys from relation in order to join the table. * * @param \Illuminate\Database\Eloquent\Relations\Relation $relation * @return array * * @throws \LogicException */ protected function getJoinKeys(Relation $relation) { if ($relation instanceof MorphTo) { throw new LogicException("MorphTo relation cannot be joined."); } if ($relation instanceof HasOneOrMany) { return [$relation->getForeignKey(), $relation->getQualifiedParentKeyName()]; } if ($relation instanceof BelongsTo) { return [$relation->getQualifiedForeignKey(), $relation->getQualifiedOtherKeyName()]; } if ($relation instanceof BelongsToMany) { return [$relation->getOtherKey(), $relation->getRelated()->getQualifiedKeyName()]; } if ($relation instanceof HasManyThrough) { $fk = $relation->getRelated()->getTable() . '.' . $relation->getParent()->getForeignKey(); return [$fk, $relation->getParent()->getQualifiedKeyName()]; } }
/** * @param Relation $relation */ protected function preserveKeys(Relation $relation) { if ($relation instanceof HasOneOrMany) { $fk = str_replace($this->getTable() . '.', '', $relation->getForeignKey()); $this->attributes[$fk] = $relation->getParentKey(); } }