Laravel 7 leftJoin, Distinct и Sort by related selected_at - PullRequest
0 голосов
/ 19 апреля 2020

Я разрабатываю веб-сайт со списком объявлений, посвященный используемым видеоиграм, с Laravel 7. У меня есть таблица «ИГРЫ» и таблица «СПИСКИ» как таковая.

ИГРЫ

CREATE TABLE `games` (
 `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
 `title` text COLLATE utf8mb4_unicode_ci NOT NULL,
 `slug` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
 `deleted_at` timestamp NULL DEFAULT NULL,
 `created_at` timestamp NULL DEFAULT NULL,
 `updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `fulltext_index` (`title`)
) ENGINE=InnoDB AUTO_INCREMENT=10230 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

LISTINGS

CREATE TABLE `listings` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) unsigned NOT NULL,
`game_id` bigint(20) unsigned NOT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`deleted_at` timestamp NULL DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `listings_user_id_foreign` (`user_id`),
KEY `listings_game_id_foreign` (`game_id`),
CONSTRAINT `listings_game_id_foreign` FOREIGN KEY (`game_id`) REFERENCES `games` (`id`) ON DELETE CASCADE,
CONSTRAINT `listings_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=412 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Мне нужно иметь разбитый на страницы список всех «ИГР» (не списков), которые сортируются по столбцу «create_at» последней прикрепленной «LISTING» .

Благодаря @mayankmodi, который помог решить одну из проблем, я обновил часть ниже, чтобы сосредоточиться на проблеме сортировки.

Если я сделаю это в моем gameController:

$games = Game::leftJoin('listings', function($leftJoin)
 {
 $leftJoin->on('listings.game_id', 'games.id')
 ->whereNull('listings.deleted_at');
 })
->select('games.*', 'listings.created_at')
->orderByDesc('listings.created_at')
->groupBy('games.id')
->with(['listings' => function ($query) {
$query->latest();
}])
->simplePaginate(36);

Мои игры различаются, но не упорядочены по последнему приложенному листингу.created_at.

У вас есть идеи, как решить эту проблему?

1 Ответ

0 голосов
/ 19 апреля 2020

Хорошо, я заставил его работать, как и ожидалось.

Если кто-то может извлечь выгоду из 4+ часов, попробовавших что-то, я вставлю здесь свое решение.

$games = Game::leftJoin('listings', function($leftJoin){
 $leftJoin->whereNull('listings.deleted_at')
 ->on('listings.game_id', 'games.id');
 })
->select('games.*', DB::raw('MAX(listings.id) AS latest_listing'))
->groupBy('games.id')
->orderByDesc('latest_listing')
->with('listings')
->simplePaginate(36);

Спасибо за вашу помощь!

...