Laravel группировка и упорядочивание результатов базы данных - PullRequest
1 голос
/ 20 января 2020

Допустим, у меня есть следующая таблица ...

+----+---------------------+---------+---------------------+
| id | slug                | version | created_at          |
+----+---------------------+---------+---------------------+
| 1  | url-friendly-string | 1.0.0   | 2020-01-19 01:00:00 |
+----+---------------------+---------+---------------------+
| 2  | url-friendly-string | 1.0.0   | 2020-01-19 02:00:00 |
+----+---------------------+---------+---------------------+
| 3  | url-friendly-string | 1.0.1   | 2020-01-20 00:00:00 |
+----+---------------------+---------+---------------------+
| 4  | another             | 0.0.1   | 2020-01-20 00:30:00 |
+----+---------------------+---------+---------------------+
| 5  | another             | 0.0.2   | 2020-01-20 01:00:00 |
+----+---------------------+---------+---------------------+

Может быть несколько записей с одинаковыми slug и version, и я хочу получить самую последнюю, самую высокую версию каждого элемента, сгруппированную на slug. Например, конечный результат будет выглядеть примерно так ...

$collection = Array(
    Object(
        'slug' => 'another',
        'version' => '0.0.2',
        'created_at' => '2020-01-20 01:00:00'
    ),
    Object(
        'slug' => 'url-friendly-string',
        'version' => '1.0.1',
        'created_at' => '2020-01-20 00:00:00'
    )
)

Я пробовал следующее ...

1.

$collection = auth()->user()
    ->items()
    ->orderBy('created_at', 'desc')
    ->orderBy('version', 'desc')
    ->groupBy('slug', 'version')
    ->get();

Который выдает:

Синтаксическая ошибка или нарушение прав доступа: 1055 Выражение # 1 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец

Хороший Ответ об этой ошибке можно найти здесь: { ссылка }

2.

$collection = auth()->user()
    ->items()
    ->orderBy('created_at', 'desc')
    ->orderBy('version', 'desc')
    ->get()
    ->groupBy('slug', 'version')
    ->map(function($group) {
        return $group->first();
    });

Какие работы, но могут привести к неправильному заказу .


Как мне добраться туда, где я должен быть?

Это новый проект, поэтому уничтожение таблиц и т. Д. c не является проблемой.

1 Ответ

0 голосов
/ 21 января 2020

Вы можете отсортировать таблицу сначала через подзапрос, попробуйте это:

$subSql = DB::table('my_table')->orderBy('version', 'desc')->toSql();

$result = DB::table( DB::raw("({$subSql}) as subQuery") )
    ->groupBy('slug')
    ->get();
...