/** * 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; }
/** * 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()]; } }