# Criteria über ein Flag / Product-Tag

**URL:** <https://forum.shopware.com/t/criteria-ueber-ein-flag-product-tag/86746>\
**Category:** Shopware 6 (German)\
**Created:** [9. April 2021 um 07:16 UTC](https://forum.shopware.com/t/criteria-ueber-ein-flag-product-tag/86746 "2021-04-09T07:16:16Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![CarstenHarnisch](https://avatars.discourse-cdn.com/v4/letter/c/f0a364/32.png) [@CarstenHarnisch](https://forum.shopware.com/u/CarstenHarnisch)\
**Post date:** [9. April 2021 um 07:16 UTC](https://forum.shopware.com/t/criteria-ueber-ein-flag-product-tag/86746/1 "2021-04-09T07:16:16Z")

</div>

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 ?

---

<div class="post-metadata">

**Author:** ![spieles21](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/spieles21/32/13091_2.png) [@spieles21](https://forum.shopware.com/u/spieles21)\
**Post date:** [9. April 2021 um 08:53 UTC](https://forum.shopware.com/t/criteria-ueber-ein-flag-product-tag/86746/2 "2021-04-09T08:53:29Z")

</div>

Hallo,

versuch es mal mit

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

```

---

<div class="post-metadata">

**Author:** ![CarstenHarnisch](https://avatars.discourse-cdn.com/v4/letter/c/f0a364/32.png) [@CarstenHarnisch](https://forum.shopware.com/u/CarstenHarnisch)\
**Post date:** [10. April 2021 um 09:17 UTC](https://forum.shopware.com/t/criteria-ueber-ein-flag-product-tag/86746/3 "2021-04-10T09:17:50Z")

</div>

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 …
