88
99namespace App \Actions \Photo ;
1010
11+ use App \Constants \PhotoAlbum as PA ;
1112use App \Enum \SizeVariantType ;
1213use App \Exceptions \Internal \LycheeAssertionError ;
1314use App \Exceptions \Internal \QueryBuilderException ;
1920use App \Models \Statistics ;
2021use Illuminate \Database \Query \Builder as BaseBuilder ;
2122use Illuminate \Database \Query \JoinClause ;
23+ use Illuminate \Support \Facades \DB ;
2224
2325/**
2426 * Deletes the photos with the designated IDs **efficiently**.
@@ -159,13 +161,15 @@ private function collectSizeVariantPathsByAlbumID(array $album_ids): void
159161 $ size_variants = SizeVariant::query ()
160162 ->from ('size_variants as sv ' )
161163 ->select (['sv.short_path ' , 'sv.storage_disk ' ])
164+ ->leftJoin (PA ::PHOTO_ALBUM , PA ::PHOTO_ID , '= ' , 'sv.photo_id ' )
162165 ->join ('photos as p ' , 'p.id ' , '= ' , 'sv.photo_id ' )
163- ->leftJoin ('photos as dup ' , function (JoinClause $ join ) use ($ album_ids ): void {
164- $ join
165- ->on ('dup.checksum ' , '= ' , 'p.checksum ' )
166- ->whereNotIn ('dup.album_id ' , $ album_ids );
167- })
168- ->whereIn ('p.album_id ' , $ album_ids )
166+ ->joinSub (DB ::table ('photos ' )->leftJoin (PA ::PHOTO_ALBUM , 'photos.id ' , '= ' , PA ::PHOTO_ID )->select ('id ' , 'checksum ' , 'album_id ' ), 'dup ' ,
167+ function (JoinClause $ join ) use ($ album_ids ): void {
168+ $ join
169+ ->on ('dup.checksum ' , '= ' , 'p.checksum ' )
170+ ->whereNotIn ('dup.album_id ' , $ album_ids );
171+ }, 'left ' )
172+ ->whereIn (PA ::ALBUM_ID , $ album_ids )
169173 ->whereNull ('dup.id ' )
170174 ->get ();
171175 $ this ->fileDeleter ->addSizeVariants ($ size_variants );
@@ -253,12 +257,14 @@ private function collectLivePhotoPathsByAlbumID(array $album_ids)
253257 ->on ('sv.photo_id ' , '= ' , 'p.id ' )
254258 ->where ('sv.type ' , '= ' , SizeVariantType::ORIGINAL );
255259 })
256- ->leftJoin ('photos as dup ' , function (JoinClause $ join ) use ($ album_ids ): void {
257- $ join
258- ->on ('dup.live_photo_checksum ' , '= ' , 'p.live_photo_checksum ' )
259- ->whereNotIn ('dup.album_id ' , $ album_ids );
260- })
261- ->whereIn ('p.album_id ' , $ album_ids )
260+ ->joinSub (DB ::table ('photos ' )->leftJoin (PA ::PHOTO_ALBUM , 'photos.id ' , '= ' , PA ::PHOTO_ID )->select ('id ' , 'live_photo_checksum ' , 'album_id ' ), 'dup ' ,
261+ function (JoinClause $ join ) use ($ album_ids ): void {
262+ $ join
263+ ->on ('dup.live_photo_checksum ' , '= ' , 'p.live_photo_checksum ' )
264+ ->whereNotIn ('dup.album_id ' , $ album_ids );
265+ }, 'left ' )
266+ ->leftJoin (PA ::PHOTO_ALBUM , PA ::PHOTO_ID , '= ' , 'p.id ' )
267+ ->whereIn (PA ::ALBUM_ID , $ album_ids )
262268 ->whereNull ('dup.id ' )
263269 ->whereNotNull ('p.live_photo_short_path ' )
264270 ->get (['p.live_photo_short_path ' , 'sv.storage_disk ' ]);
@@ -301,7 +307,8 @@ private function deleteDBRecords(array $photo_ids, array $album_ids): void
301307 $ query
302308 ->from ('photos ' , 'p ' )
303309 ->whereColumn ('p.id ' , '= ' , 'size_variants.photo_id ' )
304- ->whereIn ('p.album_id ' , $ album_ids );
310+ ->leftJoin (PA ::PHOTO_ALBUM , PA ::PHOTO_ID , '= ' , 'p.id ' )
311+ ->whereIn (PA ::ALBUM_ID , $ album_ids );
305312 })
306313 ->delete ();
307314 }
@@ -316,10 +323,17 @@ private function deleteDBRecords(array $photo_ids, array $album_ids): void
316323 $ query
317324 ->from ('photos ' , 'p ' )
318325 ->whereColumn ('p.id ' , '= ' , 'statistics.photo_id ' )
319- ->whereIn ('p.album_id ' , $ album_ids );
326+ ->leftJoin (PA ::PHOTO_ALBUM , PA ::PHOTO_ID , '= ' , 'p.id ' )
327+ ->whereIn (PA ::ALBUM_ID , $ album_ids );
320328 })
321329 ->delete ();
322330 }
331+ if (count ($ photo_ids ) !== 0 ) {
332+ DB ::table (PA ::PHOTO_ALBUM )->whereIn (PA ::PHOTO_ID , $ photo_ids )->delete ();
333+ }
334+ if (count ($ album_ids ) !== 0 ) {
335+ DB ::table (PA ::PHOTO_ALBUM )->whereIn (PA ::ALBUM_ID , $ album_ids )->delete ();
336+ }
323337 if (count ($ photo_ids ) !== 0 ) {
324338 Photo::query ()->whereIn ('id ' , $ photo_ids )->delete ();
325339 }
0 commit comments