Skip to content

Commit 8fa82fa

Browse files
authored
Preserve Relation field query order (#2890)
1 parent 7e63b9c commit 8fa82fa

File tree

3 files changed

+35
-30
lines changed

3 files changed

+35
-30
lines changed

resources/js/controllers/relation_controller.js

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,18 +68,10 @@ export default class extends ApplicationController {
6868
searchColumns,
6969
chunk,
7070
})
71-
.then((response) => {
72-
const options = [];
73-
74-
Object.entries(response.data).forEach((entry) => {
75-
const [value, label] = entry;
76-
77-
options.push({ label, value });
78-
});
79-
80-
this.choices.clearOptions();
81-
callback(options);
82-
});
71+
.then((response) => {
72+
this.choices.clearOptions();
73+
callback(response.data);
74+
});
8375
}
8476

8577
/**

src/Platform/Http/Controllers/RelationController.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,12 @@ private function buildersItems(
7272
}
7373

7474
if (is_a($model, BaseCollection::class)) {
75-
return $model->take($chunk)->pluck($append ?? $name, $key);
75+
return $model->take($chunk)->map(function ($item) use ($append, $key, $name) {
76+
return [
77+
'value' => $item->$key,
78+
'label' => $item->$append ?? $item->$name,
79+
];
80+
});
7681
}
7782

7883
$model = $model->where(function ($query) use ($name, $search, $searchColumns) {
@@ -87,19 +92,22 @@ private function buildersItems(
8792
return $model
8893
->limit($chunk)
8994
->get()
90-
->mapWithKeys(function ($item) use ($append, $key, $name) {
95+
->map(function ($item) use ($append, $key, $name) {
9196
$resultKey = $item->$key;
9297

93-
$value = $item->$append ?? $item->$name;
98+
$resultLabel = $item->$append ?? $item->$name;
9499

95100
if ($resultKey instanceof \UnitEnum) {
96101
$resultKey = $resultKey->value;
97102
}
98-
if ($value instanceof \UnitEnum) {
99-
$value = $value->value;
103+
if ($resultLabel instanceof \UnitEnum) {
104+
$resultLabel = $resultLabel->value;
100105
}
101106

102-
return [$resultKey => $value];
107+
return [
108+
'value' => $resultKey,
109+
'label' => $resultLabel,
110+
];
103111
});
104112
}
105113
}

tests/Feature/Platform/RelationsTest.php

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,13 @@ public static function scopeList(): array
4343
public function testScopeModel(array $scope): void
4444
{
4545
$response = $this->getScope($scope);
46-
$json = $this->users->pluck('email', 'id')->toArray();
46+
47+
$json = $this->users->map(function ($user) {
48+
return [
49+
'value' => $user->id,
50+
'label' => $user->email,
51+
];
52+
})->toArray();
4753

4854
$response->assertJson($json);
4955
}
@@ -56,14 +62,13 @@ public function testScopeModel(array $scope): void
5662
public function testAppendModel(array $scope): void
5763
{
5864
$response = $this->getScope($scope, 'full');
59-
60-
$users = collect();
61-
62-
$this->users->each(function (User $user) use ($users) {
63-
$users->put($user->id, $user->name.' ('.$user->email.')');
64-
});
65-
66-
$json = $users->toArray();
65+
66+
$json = $this->users->map(function ($user) {
67+
return [
68+
'value' => $user->id,
69+
'label' => $user->name . ' (' . $user->email . ')',
70+
];
71+
})->toArray();
6772

6873
$response->assertJson($json);
6974
}
@@ -81,7 +86,7 @@ public function testParamsForScopeModel(): void
8186
]);
8287

8388
$response->assertJson([
84-
$user->id => $user->email,
89+
['value' => $user->id, 'label' => $user->email],
8590
]);
8691
}
8792

@@ -124,7 +129,7 @@ public function testSearchColumns()
124129
->post(route('platform.systems.relation'), $params);
125130

126131
$response->assertJson([
127-
$user->id => $user->name.' ('.$user->email.')',
132+
['value' => $user->id, 'label' => $user->name . ' (' . $user->email . ')'],
128133
]);
129134
}
130135

@@ -154,7 +159,7 @@ public function testSearchColumnsWithScopes()
154159
$latest_query = array_pop($queryLog);
155160

156161
$response->assertJson([
157-
$user->id => $user->name.' ('.$user->email.')',
162+
['value' => $user->id, 'label' => $user->name . ' (' . $user->email . ')'],
158163
]);
159164

160165
$this->assertContains('select * from "users" where "name" = ? and ("email" like ? or "id" like ?) limit 10', $latest_query);

0 commit comments

Comments
 (0)