diff --git a/app/Http/Controllers/Gallery/AlbumController.php b/app/Http/Controllers/Gallery/AlbumController.php index e149f48..aaf936a 100644 --- a/app/Http/Controllers/Gallery/AlbumController.php +++ b/app/Http/Controllers/Gallery/AlbumController.php @@ -71,14 +71,14 @@ class AlbumController extends Controller else if ($requestedView != 'slideshow') { $photos = $album->photos() - ->orderBy(DB::raw('COALESCE(taken_at, created_at)')) + ->orderBy(DB::raw('COALESCE(taken_at, created_at), name, id')) ->paginate(UserConfig::get('items_per_page')); } else { // The slideshow view needs access to all photos, not paged $photos = $album->photos() - ->orderBy(DB::raw('COALESCE(taken_at, created_at)')) + ->orderBy(DB::raw('COALESCE(taken_at, created_at), name, id')) ->get(); } diff --git a/app/Http/Controllers/Gallery/PhotoController.php b/app/Http/Controllers/Gallery/PhotoController.php index 708fbd2..bd50bb0 100644 --- a/app/Http/Controllers/Gallery/PhotoController.php +++ b/app/Http/Controllers/Gallery/PhotoController.php @@ -105,14 +105,40 @@ class PhotoController extends Controller // Load the Next/Previous buttons $thisPhotoDate = is_null($photo->taken_at) ? $photo->created_at : $photo->taken_at; - $previousPhoto = $album->photos() - ->where(DB::raw('COALESCE(taken_at, created_at)'), '<', $thisPhotoDate) - ->orderBy(DB::raw('COALESCE(taken_at, created_at)'), 'desc') - ->first(); - $nextPhoto = $album->photos() - ->where(DB::raw('COALESCE(taken_at, created_at)'), '>', $thisPhotoDate) - ->orderBy(DB::raw('COALESCE(taken_at, created_at)')) - ->first(); + // I don't like the idea of using a totally raw SQL query, but it's the only sure-fire way to number the rows + // so we can get the previous/next photos accurately - and we don't have to load all data for the photo objects + $previousPhoto = null; + $nextPhoto = null; + + $allAlbumPhotos = DB::select( + DB::raw( + 'SELECT p.id, (@row_number:=@row_number + 1) AS row_number + FROM photos p, (SELECT @row_number:=0) AS t + WHERE p.album_id = :album_id + ORDER BY COALESCE(p.taken_at, p.created_at), p.name, p.id;' + ), + [ + 'album_id' => $album->id + ] + ); + + for ($i = 0; $i < count($allAlbumPhotos); $i++) + { + if ($allAlbumPhotos[$i]->id === $photo->id) + { + if ($i > 0) + { + $previousPhoto = Photo::where('id', $allAlbumPhotos[$i - 1]->id)->first(); + } + + if ($i + 1 < count($allAlbumPhotos)) + { + $nextPhoto = Photo::where('id', $allAlbumPhotos[$i + 1]->id)->first(); + } + + break; + } + } // Record the visit to the photo if (UserConfig::get('enable_visitor_hits'))