Skip to content

Commit

Permalink
Merge pull request #61 from Kyslik/fix/self-referencing-relationship
Browse files Browse the repository at this point in the history
Fix #60
  • Loading branch information
Kyslik authored Aug 28, 2017
2 parents d5be2a0 + dd46a19 commit a43a5a5
Show file tree
Hide file tree
Showing 3 changed files with 127 additions and 74 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,7 @@ public function detail()
```

### Define belongsTo relation
>**Note**: in case we have self-referencing model (like comments, categories); parent table will be aliased with `parent_` string, for more information see [issue #60](https://github.com/Kyslik/column-sortable/issues/60).
```
/**
Expand Down
24 changes: 15 additions & 9 deletions src/ColumnSortable/Sortable.php
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,11 @@ private function queryOrderBuilder($query, array $sortParameters)
$explodeResult = SortableLink::explodeSortParameter($column);
if ( ! empty($explodeResult)) {
$relationName = $explodeResult[0];
$column = $explodeResult[1];
$column = $explodeResult[1];

try {
$relation = $query->getRelation($relationName);
$query = $this->queryJoinBuilder($query, $relation);
$query = $this->queryJoinBuilder($query, $relation);
} catch (BadMethodCallException $e) {
throw new ColumnSortableException($relationName, 1, $e);
} catch (\Exception $e) {
Expand All @@ -83,7 +83,7 @@ private function queryOrderBuilder($query, array $sortParameters)
$query = $query->orderBy($column, $direction);
} elseif ($this->columnExists($model, $column)) {
$column = $model->getTable().'.'.$column;
$query = $query->orderBy($column, $direction);
$query = $query->orderBy($column, $direction);
}

return $query;
Expand Down Expand Up @@ -122,16 +122,22 @@ private function parseSortParameters(array $sortParameters)
private function queryJoinBuilder($query, $relation)
{
$relatedTable = $relation->getRelated()->getTable();
$parentTable = $relation->getParent()->getTable();
$parentTable = $relation->getParent()->getTable();

if ($parentTable === $relatedTable) {
$query = $query->from($parentTable.' as parent_'.$parentTable);
$parentTable = 'parent_'.$parentTable;
$relation->getParent()->setTable($parentTable);
}

if ($relation instanceof HasOne) {
$relatedPrimaryKey = $relation->getQualifiedForeignKeyName();
$parentPrimaryKey = $relation->getQualifiedParentKeyName();
$parentPrimaryKey = $relation->getQualifiedParentKeyName();

return $query->select($parentTable.'.*')->join($relatedTable, $parentPrimaryKey, '=', $relatedPrimaryKey);
} elseif ($relation instanceof BelongsTo) {
$relatedPrimaryKey = $relation->getQualifiedOwnerKeyName();
$parentPrimaryKey = $relation->getQualifiedForeignKey();
$parentPrimaryKey = $relation->getQualifiedForeignKey();

return $query->select($parentTable.'.*')->join($relatedTable, $parentPrimaryKey, '=', $relatedPrimaryKey);
} else {
Expand All @@ -148,8 +154,8 @@ private function queryJoinBuilder($query, $relation)
*/
private function columnExists($model, $column)
{
return (isset($model->sortable)) ? in_array($column, $model->sortable) : Schema::hasColumn($model->getTable(),
$column);
return (isset($model->sortable)) ? in_array($column, $model->sortable) :
Schema::hasColumn($model->getTable(), $column);
}


Expand All @@ -175,7 +181,7 @@ private function formatToSortParameters($sort)

return ($each[0] === 0) ? ['sort' => $each[1], 'order' => $configDefaultOrder] : [
'sort' => $each[0],
'order' => $each[1]
'order' => $each[1],
];
}
}
Loading

0 comments on commit a43a5a5

Please sign in to comment.