Skip to content

Commit d9b3944

Browse files
committed
fix order
1 parent 222d03f commit d9b3944

File tree

6 files changed

+78
-6
lines changed

6 files changed

+78
-6
lines changed

database/migrations/000_create_groups_table.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public function up(): void
4343
->cascadeOnDelete();
4444

4545
$table->string('slug')->unique();
46-
$table->string('name')->unique();
46+
$table->string('name');
4747
$table->string('type')->nullable();
4848

4949
$table->order();

src/Models/Group.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Yuges\Package\Models\Model;
66
use Yuges\Groupable\Config\Config;
77
use Yuges\Sluggable\Traits\HasSlug;
8+
use Yuges\Groupable\Traits\HasOrder;
89
use Yuges\Groupable\Traits\HasParent;
910
use Yuges\Sluggable\Options\SlugOptions;
1011
use Yuges\Sluggable\Interfaces\Sluggable;
@@ -18,7 +19,7 @@
1819
*/
1920
class Group extends Model implements Sluggable
2021
{
21-
use HasFactory, HasParent, HasGrouperator, HasSlug;
22+
use HasFactory, HasParent, HasGrouperator, HasSlug, HasOrder;
2223

2324
protected $table = 'groups';
2425

@@ -40,4 +41,12 @@ public function sluggable(): SlugOptions
4041

4142
return $options;
4243
}
44+
45+
public function getHighestOrderNumber(): int
46+
{
47+
return (int) static::query()
48+
->where('grouperator_id', $this->grouperator_id)
49+
->where('grouperator_type', $this->grouperator_type)
50+
->max($this->determineOrderColumnName());
51+
}
4352
}

src/Models/Groupable.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Yuges\Groupable\Config\Config;
66
use Yuges\Package\Traits\HasTable;
7+
use Yuges\Groupable\Traits\HasOrder;
78
use Yuges\Package\Traits\HasTimestamps;
89
use Yuges\Groupable\Traits\HasGrouperator;
910
use Illuminate\Database\Eloquent\Relations\MorphTo;
@@ -12,7 +13,7 @@
1213

1314
class Groupable extends MorphPivot
1415
{
15-
use HasFactory, HasTable, HasTimestamps, HasGrouperator;
16+
use HasFactory, HasTable, HasTimestamps, HasGrouperator, HasOrder;
1617

1718
public $table = 'groupables';
1819

@@ -27,4 +28,13 @@ public function groupable(): MorphTo
2728
{
2829
return $this->morphTo();
2930
}
31+
32+
public function getHighestOrderNumber(): int
33+
{
34+
return (int) static::query()
35+
->where('group_id', $this->group_id)
36+
->where('grouperator_id', $this->grouperator_id)
37+
->where('grouperator_type', $this->grouperator_type)
38+
->max($this->determineOrderColumnName());
39+
}
3040
}

src/Observers/GroupObserver.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@
77

88
class GroupObserver
99
{
10+
public function creating(Group $group): void
11+
{
12+
if ($group->shouldSortWhenCreating()) {
13+
if (is_null($group->order)) {
14+
$group->setHighestOrderNumber();
15+
}
16+
}
17+
}
18+
1019
public function saving(Group $group): void
1120
{
1221

src/Observers/GroupableObserver.php

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,25 @@
22

33
namespace Yuges\Groupable\Observers;
44

5-
use Illuminate\Database\Eloquent\Model;
5+
use Yuges\Groupable\Models\Groupable;
66

77
class GroupableObserver
88
{
9-
public function saving(Model $model): void
9+
public function creating(Groupable $groupable): void
10+
{
11+
if ($groupable->shouldSortWhenCreating()) {
12+
if (is_null($groupable->order)) {
13+
$groupable->setHighestOrderNumber();
14+
}
15+
}
16+
}
17+
18+
public function saving(Groupable $groupable): void
1019
{
1120

1221
}
1322

14-
public function deleted(Model $model): void
23+
public function deleted(Groupable $groupable): void
1524
{
1625

1726
}

src/Traits/HasOrder.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
namespace Yuges\Groupable\Traits;
4+
5+
use Illuminate\Database\Eloquent\Builder;
6+
7+
/**
8+
* @property integer $order
9+
*/
10+
trait HasOrder
11+
{
12+
abstract public function getHighestOrderNumber(): int;
13+
14+
public function setHighestOrderNumber(): void
15+
{
16+
$column = $this->determineOrderColumnName();
17+
18+
$this->$column = $this->getHighestOrderNumber() + 1;
19+
}
20+
21+
public function scopeOrdered(Builder $query): Builder
22+
{
23+
return $query->orderBy($this->determineOrderColumnName());
24+
}
25+
26+
protected function determineOrderColumnName(): string
27+
{
28+
return 'order';
29+
}
30+
31+
public function shouldSortWhenCreating(): bool
32+
{
33+
return true;
34+
}
35+
}

0 commit comments

Comments
 (0)