Skip to content

Commit a43a5a5

Browse files
authored
Merge pull request #61 from Kyslik/fix/self-referencing-relationship
Fix #60
2 parents d5be2a0 + dd46a19 commit a43a5a5

File tree

3 files changed

+127
-74
lines changed

3 files changed

+127
-74
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ public function detail()
224224
```
225225

226226
### Define belongsTo relation
227+
>**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).
227228
228229
```
229230
/**

src/ColumnSortable/Sortable.php

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ private function queryOrderBuilder($query, array $sortParameters)
6161
$explodeResult = SortableLink::explodeSortParameter($column);
6262
if ( ! empty($explodeResult)) {
6363
$relationName = $explodeResult[0];
64-
$column = $explodeResult[1];
64+
$column = $explodeResult[1];
6565

6666
try {
6767
$relation = $query->getRelation($relationName);
68-
$query = $this->queryJoinBuilder($query, $relation);
68+
$query = $this->queryJoinBuilder($query, $relation);
6969
} catch (BadMethodCallException $e) {
7070
throw new ColumnSortableException($relationName, 1, $e);
7171
} catch (\Exception $e) {
@@ -83,7 +83,7 @@ private function queryOrderBuilder($query, array $sortParameters)
8383
$query = $query->orderBy($column, $direction);
8484
} elseif ($this->columnExists($model, $column)) {
8585
$column = $model->getTable().'.'.$column;
86-
$query = $query->orderBy($column, $direction);
86+
$query = $query->orderBy($column, $direction);
8787
}
8888

8989
return $query;
@@ -122,16 +122,22 @@ private function parseSortParameters(array $sortParameters)
122122
private function queryJoinBuilder($query, $relation)
123123
{
124124
$relatedTable = $relation->getRelated()->getTable();
125-
$parentTable = $relation->getParent()->getTable();
125+
$parentTable = $relation->getParent()->getTable();
126+
127+
if ($parentTable === $relatedTable) {
128+
$query = $query->from($parentTable.' as parent_'.$parentTable);
129+
$parentTable = 'parent_'.$parentTable;
130+
$relation->getParent()->setTable($parentTable);
131+
}
126132

127133
if ($relation instanceof HasOne) {
128134
$relatedPrimaryKey = $relation->getQualifiedForeignKeyName();
129-
$parentPrimaryKey = $relation->getQualifiedParentKeyName();
135+
$parentPrimaryKey = $relation->getQualifiedParentKeyName();
130136

131137
return $query->select($parentTable.'.*')->join($relatedTable, $parentPrimaryKey, '=', $relatedPrimaryKey);
132138
} elseif ($relation instanceof BelongsTo) {
133139
$relatedPrimaryKey = $relation->getQualifiedOwnerKeyName();
134-
$parentPrimaryKey = $relation->getQualifiedForeignKey();
140+
$parentPrimaryKey = $relation->getQualifiedForeignKey();
135141

136142
return $query->select($parentTable.'.*')->join($relatedTable, $parentPrimaryKey, '=', $relatedPrimaryKey);
137143
} else {
@@ -148,8 +154,8 @@ private function queryJoinBuilder($query, $relation)
148154
*/
149155
private function columnExists($model, $column)
150156
{
151-
return (isset($model->sortable)) ? in_array($column, $model->sortable) : Schema::hasColumn($model->getTable(),
152-
$column);
157+
return (isset($model->sortable)) ? in_array($column, $model->sortable) :
158+
Schema::hasColumn($model->getTable(), $column);
153159
}
154160

155161

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

176182
return ($each[0] === 0) ? ['sort' => $each[1], 'order' => $configDefaultOrder] : [
177183
'sort' => $each[0],
178-
'order' => $each[1]
184+
'order' => $each[1],
179185
];
180186
}
181187
}

0 commit comments

Comments
 (0)