Clean up unused Tags, LocSubjects, and Collections

On `Ebook::Save()` and `Ebook::Delete()`, remove any unreferenced `Tag`,
`LocSubject`, and `Collection` records. These are analogous to these lines in
`Ebook::Create()`:

```
$this->CreateTags();
$this->CreateLocSubjects();
$this->CreateCollections();
```

`EbookPlaceholder`s can't have `Tags` or `LocSubjects` at the moment, but other
mistakes in production that are later corrected could leave unused `Tags` and
`LocSubjects`.

Context: https://github.com/standardebooks/web/pull/447#issuecomment-2555734692
This commit is contained in:
Mike Colagrosso 2024-12-23 20:55:20 -07:00 committed by Alex Cabal
parent 88ed9639f5
commit d6dd10be9c
4 changed files with 44 additions and 0 deletions

View file

@ -99,6 +99,17 @@ class Collection{
', [], Collection::class); ', [], Collection::class);
} }
/**
* Deletes `Collection`s that no `Ebook`s are members of.
*/
public static function DeleteUnused(): void{
Db::Query('
DELETE
from Collections
where CollectionId not in
(select distinct CollectionId from CollectionEbooks)
');
}
// ******* // *******
// METHODS // METHODS

View file

@ -1984,6 +1984,10 @@ final class Ebook{
$this->RemoveEbookPlaceholder(); $this->RemoveEbookPlaceholder();
$this->AddEbookPlaceholder(); $this->AddEbookPlaceholder();
EbookTag::DeleteUnused();
LocSubject::DeleteUnused();
Collection::DeleteUnused();
} }
catch(Exceptions\ValidationException $ex){ catch(Exceptions\ValidationException $ex){
$error = new Exceptions\InvalidEbookException(); $error = new Exceptions\InvalidEbookException();
@ -2176,6 +2180,10 @@ final class Ebook{
$this->RemoveTocEntries(); $this->RemoveTocEntries();
$this->RemoveEbookPlaceholder(); $this->RemoveEbookPlaceholder();
EbookTag::DeleteUnused();
LocSubject::DeleteUnused();
Collection::DeleteUnused();
foreach($this->Projects as $project){ foreach($this->Projects as $project){
$project->Delete(); $project->Delete();
} }

View file

@ -107,4 +107,17 @@ class EbookTag extends Tag{
return $tags; return $tags;
} }
/**
* Deletes `EbookTag`s that are not associated with any `Ebook`s.
*/
public static function DeleteUnused(): void{
Db::Query('
DELETE
from Tags
where Type = ?
and TagId not in
(select distinct TagId from EbookTags)
', [Enums\TagType::Ebook]);
}
} }

View file

@ -64,4 +64,16 @@ class LocSubject{
return $this; return $this;
} }
} }
/**
* Deletes `LocSubject`s that are not associated with any `Ebook`s.
*/
public static function DeleteUnused(): void{
Db::Query('
DELETE
from LocSubjects
where LocSubjectId not in
(select distinct LocSubjectId from EbookLocSubjects)
');
}
} }