Criteria über ein Flag / Product-Tag

Ich würde gerne Artikel an Hand eines Product-Tags filtern wollen. Dabei soll die Logik sein:

"Zeige alle Produkte, ausser die die einen bestimmten Tag gesetzt haben. "

In SQL dann sowas :

where tags is null or not tags = ‚spezial‘

Aktuell versuche mich für das Setzen eines Criteria mit:

$tagIds = ["7d2ab910259841fea6552efb520daeef"];
$criteria->addFilter(
        new NotFilter(NotFilter::CONNECTION_AND,
            [new EqualsAnyFilter('product.tagIds', $tagIds)]),
);

Nur leider führt das dann am Ende zum einem leeren Ergebnis. Wenn ich mir das finale SQL anschauen, dann hat es hier so etwas:

where NOT ((JSON_CONTAINS(IFNULL(product.tag_ids, product.parent.tag_ids), JSON_ARRAY('uuid'))));

Das Problem hier ist, dass damit halt auch alle Sätze rausfallen, bei denen keine Tags gesetzt wurde und dann die Spalte NULL ist.

sprich da müsste dann sowas stehen :
where NOT ((JSON_CONTAINS(COALESCE(product.tag_ids, product.parent.tag_ids, '[]'), JSON_ARRAY('uuid'))));

also COALESCE(…, ‚‘) …

Die Frage nun, wie bekommt man das dass hier rein gefummelt ?

Hallo,

versuch es mal mit

$criteria->addFilter(
    new NotFilter(NotFilter::CONNECTION_AND, [
        new EqualsAnyFilter('product.tagIds', $tagIds),
        new EqualsFilter('product.tagIds', null)
]));

Ich habe jetzt den EntityDefinitionQueryHelper überladen und in der Methode buildInheritedAccessor den Rückgabewert umgestellt von

return sprintf ('IFNULL(%s, %s)', $select, $parentSelect);
auf
return sprintf("COALESCE(%s, %s, '[]')", $select, $parentSelect);

Leider ein Riesenaufwand …