aboutsummaryrefslogtreecommitdiff
path: root/app/Models/EntryDAO.php
diff options
context:
space:
mode:
authorGravatar Alexandre Alapetite <alexandre@alapetite.fr> 2025-08-27 21:56:10 +0200
committerGravatar GitHub <noreply@github.com> 2025-08-27 21:56:10 +0200
commit288992d9ad64c52b77983e27f497aa6f4ed5728e (patch)
tree4364722b2efcab1504e5a3dfec9f9f0082513a9d /app/Models/EntryDAO.php
parent70f0d6d24f217ef4952225f8f57d2f86f7eb96bc (diff)
Fix logic for searching labels (#7863)
`L:1 L:2` is supposed to be an implicit `AND`, while `L:1,2` as well as `L:1 OR L:2` is an `OR` logic
Diffstat (limited to 'app/Models/EntryDAO.php')
-rw-r--r--app/Models/EntryDAO.php68
1 files changed, 38 insertions, 30 deletions
diff --git a/app/Models/EntryDAO.php b/app/Models/EntryDAO.php
index 8713ba930..4aa7c5056 100644
--- a/app/Models/EntryDAO.php
+++ b/app/Models/EntryDAO.php
@@ -937,49 +937,57 @@ SQL;
}
if ($filter->getLabelIds() !== null) {
- if ($filter->getLabelIds() === '*') {
- $sub_search .= 'AND EXISTS (SELECT et.id_tag FROM `_entrytag` et WHERE et.id_entry = ' . $alias . 'id) ';
- } else {
- $sub_search .= 'AND ' . $alias . 'id IN (SELECT et.id_entry FROM `_entrytag` et WHERE et.id_tag IN (';
- foreach ($filter->getLabelIds() as $label_id) {
- $sub_search .= '?,';
- $values[] = $label_id;
+ foreach ($filter->getLabelIds() as $label_ids) {
+ if ($label_ids === '*') {
+ $sub_search .= 'AND EXISTS (SELECT et.id_tag FROM `_entrytag` et WHERE et.id_entry = ' . $alias . 'id) ';
+ } else {
+ $sub_search .= 'AND ' . $alias . 'id IN (SELECT et.id_entry FROM `_entrytag` et WHERE et.id_tag IN (';
+ foreach ($label_ids as $label_id) {
+ $sub_search .= '?,';
+ $values[] = $label_id;
+ }
+ $sub_search = rtrim($sub_search, ',');
+ $sub_search .= ')) ';
}
- $sub_search = rtrim($sub_search, ',');
- $sub_search .= ')) ';
}
}
if ($filter->getNotLabelIds() !== null) {
- if ($filter->getNotLabelIds() === '*') {
- $sub_search .= 'AND NOT EXISTS (SELECT et.id_tag FROM `_entrytag` et WHERE et.id_entry = ' . $alias . 'id) ';
- } else {
- $sub_search .= 'AND ' . $alias . 'id NOT IN (SELECT et.id_entry FROM `_entrytag` et WHERE et.id_tag IN (';
- foreach ($filter->getNotLabelIds() as $label_id) {
- $sub_search .= '?,';
- $values[] = $label_id;
+ foreach ($filter->getNotLabelIds() as $label_ids) {
+ if ($label_ids === '*') {
+ $sub_search .= 'AND NOT EXISTS (SELECT et.id_tag FROM `_entrytag` et WHERE et.id_entry = ' . $alias . 'id) ';
+ } else {
+ $sub_search .= 'AND ' . $alias . 'id NOT IN (SELECT et.id_entry FROM `_entrytag` et WHERE et.id_tag IN (';
+ foreach ($label_ids as $label_id) {
+ $sub_search .= '?,';
+ $values[] = $label_id;
+ }
+ $sub_search = rtrim($sub_search, ',');
+ $sub_search .= ')) ';
}
- $sub_search = rtrim($sub_search, ',');
- $sub_search .= ')) ';
}
}
if ($filter->getLabelNames() !== null) {
- $sub_search .= 'AND ' . $alias . 'id IN (SELECT et.id_entry FROM `_entrytag` et, `_tag` t WHERE et.id_tag = t.id AND t.name IN (';
- foreach ($filter->getLabelNames() as $label_name) {
- $sub_search .= '?,';
- $values[] = $label_name;
+ foreach ($filter->getLabelNames() as $label_names) {
+ $sub_search .= 'AND ' . $alias . 'id IN (SELECT et.id_entry FROM `_entrytag` et, `_tag` t WHERE et.id_tag = t.id AND t.name IN (';
+ foreach ($label_names as $label_name) {
+ $sub_search .= '?,';
+ $values[] = $label_name;
+ }
+ $sub_search = rtrim($sub_search, ',');
+ $sub_search .= ')) ';
}
- $sub_search = rtrim($sub_search, ',');
- $sub_search .= ')) ';
}
if ($filter->getNotLabelNames() !== null) {
- $sub_search .= 'AND ' . $alias . 'id NOT IN (SELECT et.id_entry FROM `_entrytag` et, `_tag` t WHERE et.id_tag = t.id AND t.name IN (';
- foreach ($filter->getNotLabelNames() as $label_name) {
- $sub_search .= '?,';
- $values[] = $label_name;
+ foreach ($filter->getNotLabelNames() as $label_names) {
+ $sub_search .= 'AND ' . $alias . 'id NOT IN (SELECT et.id_entry FROM `_entrytag` et, `_tag` t WHERE et.id_tag = t.id AND t.name IN (';
+ foreach ($label_names as $label_name) {
+ $sub_search .= '?,';
+ $values[] = $label_name;
+ }
+ $sub_search = rtrim($sub_search, ',');
+ $sub_search .= ')) ';
}
- $sub_search = rtrim($sub_search, ',');
- $sub_search .= ')) ';
}
if ($filter->getAuthor() !== null) {