Example #1
0
 /**
  *	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);
     }
 }
Example #3
0
 /**
  * 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.");
 }
Example #4
0
 /**
  * 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);
 }
Example #5
0
 /**
  * Build join parameters.
  *
  * @param Relation $relation
  * @return array
  */
 protected function joinParameters(Relation $relation)
 {
     return [$relation->getRelated()->getTable(), $relation->getQualifiedParentKeyName(), '=', $relation->getForeignKey()];
 }
Example #6
0
 /**
  * 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()];
     }
 }
Example #7
0
 /**
  * @param Relation $relation
  */
 protected function preserveKeys(Relation $relation)
 {
     if ($relation instanceof HasOneOrMany) {
         $fk = str_replace($this->getTable() . '.', '', $relation->getForeignKey());
         $this->attributes[$fk] = $relation->getParentKey();
     }
 }