Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 8 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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;
}
}
Expand All @@ -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
[link-author]: https://github.com/LifeOnScreen
40 changes: 27 additions & 13 deletions src/SortRelations.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace LifeOnScreen\SortRelations;

use Illuminate\Support\Str;

/**
* Trait SortRelations
* @package LifeOnScreen\SortRelations
Expand All @@ -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;
}

/**
Expand All @@ -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);
}
}

Expand All @@ -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 {
Expand Down