diff --git a/README.md b/README.md index b64c33b..87b95e5 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,7 @@ $ composer require lifeonscreen/nova-sort-relations ## Usage -Include `LifeOnScreen\SortRelations\SortRelations` trait to your class. Define base by overriding `indexQuery`. -Define sortable columns in `$sortRelations` array. +Include `LifeOnScreen\SortRelations\SortRelations` trait to your class. Define sortable columns in `$sortRelations` array. ```php @@ -24,21 +23,21 @@ use LifeOnScreen\SortRelations\SortRelations; class Product extends Resource { public static $sortRelations = [ - // overriding id with product.id (this prevent ambiguous id, if you select multiple ids) - 'id' => 'product.id', + // Order product relation by product id... + 'product' => 'id', // overriding user relation sorting 'user' => [ // sorting multiple columns - 'users.name', - 'users.surname', + 'name', + 'surname', ], // overriding company relation sorting - 'company' => 'company.name', + 'company' => 'name', ]; public static function indexQuery(NovaRequest $request, $query) { - // You can modify your base query here. + // You can modify your base query here, only if necessary. Sort Relations will be applied automatically... return $query; } } @@ -62,4 +61,4 @@ MIT license. Please see the [license file](docs/license.md) for more information [link-packagist]: https://packagist.org/packages/lifeonscreen/nova-sort-relations [link-downloads]: https://packagist.org/packages/lifeonscreen/nova-sort-relations -[link-author]: https://github.com/LifeOnScreen \ No newline at end of file +[link-author]: https://github.com/LifeOnScreen diff --git a/src/SortRelations.php b/src/SortRelations.php index 85fc8eb..b715d95 100644 --- a/src/SortRelations.php +++ b/src/SortRelations.php @@ -2,6 +2,8 @@ namespace LifeOnScreen\SortRelations; +use Illuminate\Support\Str; + /** * Trait SortRelations * @package LifeOnScreen\SortRelations @@ -13,9 +15,17 @@ trait SortRelations * * @return array */ - public static function sortableRelations(): array + public static function sortableRelations($query): array { - return static::$sortRelations ?? []; + $model = $query->getModel(); + $return = []; + if (static::$sortRelations) { + foreach (static::$sortRelations as $relation => $columns) { + $relatedKey = $model->{$relation}()->getForeignKeyName(); + $return[$relatedKey] = ['relation' => $relation, 'columns' => $columns]; + } + } + return $return; } /** @@ -28,23 +38,25 @@ public static function sortableRelations(): array */ protected static function applyRelationOrderings(string $column, string $direction, $query) { - $sortRelations = static::sortableRelations(); + $sortRelations = static::sortableRelations($query); $model = $query->getModel(); - $relation = $column; - $related = $model->{$column}()->getRelated(); + $relation = $sortRelations[$column]; + $related = $model->{$relation['relation']}()->getRelated(); - $foreignKey = Str::snake($relation) . '_' . $related->getKeyName(); + $foreignKey = $model->{$relation['relation']}()->getForeignKeyName(); + $ownerKey = $model->{$relation['relation']}()->getOwnerKeyName(); $query->select($model->getTable() . '.*'); - $query->join($related->getTable(), $model->qualifyColumn($foreignKey), '=', $related->qualifyColumn($related->getKeyName())); - if (is_string($sortRelations[$column])) { - $qualified = $related->qualifyColumn($sortRelations[$column]); + $query->leftJoin($related->getConnection()->getDatabaseName() . '.' . $related->getTable(), $model->qualifyColumn($foreignKey), '=', $related->qualifyColumn($ownerKey)); + if (is_string($relation['columns'])) { + $qualified = $related->qualifyColumn($relation['columns']); $query->orderBy($qualified, $direction); } - if (is_array($sortRelations[$column])) { - foreach ($sortRelations[$column] as $orderColumn) { - $query->orderBy($related->qualifyColumn($orderColumn), $direction); + if (is_array($relation['columns'])) { + foreach ($relation['columns'] as $orderColumn) { + $qualified = $related->qualifyColumn($orderColumn); + $query->orderBy($qualified, $direction); } } @@ -66,9 +78,11 @@ protected static function applyOrderings($query, array $orderings) : $query; } - $sortRelations = static::sortableRelations(); + $sortRelations = static::sortableRelations($query); foreach ($orderings as $column => $direction) { + if (is_null($direction)) + $direction = 'asc'; if (array_key_exists($column, $sortRelations)) { $query = self::applyRelationOrderings($column, $direction, $query); } else {