parent
eea50d7d6b
commit
01bcf71e37
|
@ -196,7 +196,16 @@ class ArrayDatasource implements Selectable
|
|||
$filter = $query->getFilter();
|
||||
$offset = $query->hasOffset() ? $query->getOffset() : 0;
|
||||
$limit = $query->hasLimit() ? $query->getLimit() : 0;
|
||||
$data = $this->data;
|
||||
|
||||
$data = [];
|
||||
foreach ($this->data as $key => $row) {
|
||||
if ($this->keyColumn !== null && ! isset($row->{$this->keyColumn})) {
|
||||
$row = clone $row; // Make sure that this won't affect the actual data
|
||||
$row->{$this->keyColumn} = $key;
|
||||
}
|
||||
|
||||
$data[$key] = $row;
|
||||
}
|
||||
|
||||
if ($query->hasOrder()) {
|
||||
uasort($data, [$query, 'compare']);
|
||||
|
@ -206,11 +215,6 @@ class ArrayDatasource implements Selectable
|
|||
$result = [];
|
||||
$skipped = 0;
|
||||
foreach ($data as $key => $row) {
|
||||
if ($this->keyColumn !== null && !isset($row->{$this->keyColumn})) {
|
||||
$row = clone $row; // Make sure that this won't affect the actual data
|
||||
$row->{$this->keyColumn} = $key;
|
||||
}
|
||||
|
||||
if (! $filter->matches($row)) {
|
||||
continue;
|
||||
} elseif ($skipped < $offset) {
|
||||
|
|
|
@ -132,4 +132,31 @@ class ArrayDatasourceTest extends BaseTestCase
|
|||
'ArrayDatasource does not sort limited queries correctly'
|
||||
);
|
||||
}
|
||||
|
||||
public function testOrderByKeyColumnIsCorrect()
|
||||
{
|
||||
$result = (new ArrayDatasource([
|
||||
'a' => (object) [
|
||||
'foo' => 'bar',
|
||||
'baz' => 'qux'
|
||||
],
|
||||
'b' => (object) [
|
||||
'foo' => 'bar',
|
||||
'baz' => 'qux'
|
||||
],
|
||||
'c' => (object) [
|
||||
'foo' => 'bar',
|
||||
'baz' => 'qux'
|
||||
]
|
||||
]))->setKeyColumn('name')
|
||||
->select()
|
||||
->order('name', 'desc')
|
||||
->fetchAll();
|
||||
|
||||
$this->assertSame(
|
||||
['c', 'b', 'a'],
|
||||
array_keys($result),
|
||||
'ArrayDatasource does not sort queries correctly by key column'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue