API Filter

Hallo,

die API-Filter-Funktion wird hier ja im Ansatz erklärt:

Dort steht:

The list routes supports both data filtering via GET parameter and POST parameter for more complex queries. Simple queries can be made via GET parameters.

Wie funktioniert denn eine Suche über POST? An welche Adresse geht die POST-Suche? Oder mal konkret gefragt: Wie kann ich mir alle Artikel anzeigen lassen, welche KEINE EAN-Nummer haben?

Ich denke, das geht nur über die POST-Suche, oder?

Guten Morgen,

den API-Endpunkt den du suchst lautet: api/v1/search/product
Hier kannst du dann per POST-Request auf die Daten abfragen.
Zum Beispiel dies was du suchst, würde lauten:

{
    "filter":[
        {
            "type":"equals",
            "field":"product.ean",
            "value":null
        }
    ]
}

Diese Abfragen kannst du natürlich besser über die Shopware-Logik machen, aber per Hand kannst du das JSON natürlich auch erstellen.
Hierfür musst du die Filter einzeln angeben.

Über GET kannst du nur Abfragen stellen, die einen Wert haben, wie z.B. die Abfrage auf eine bestimmte EAN-Nummer:

api/v1/product?filter[product.ean]=EAN-100

Gruß

Krispin

1 Like

Hallo Krispin,

vielen Dank für Deine Antwort - super, genau danach habe ich gesucht.

Eine Frage habe ich aber noch: Kann man auch nach werten >= oder <= suchen ?

Z.B.: Zeige alle Produkte mit Lagerbestand < 10

Wie würde das aussehen?

Hi,

kein Problem, für solche Anfragen gibt es den RangeFilter (diesen findest du auch im Core unter: Framework/DataAbstractionLayer/Search/Filter/RangeFilter.php).
Diesen kann man dann zum Beispiel so nutzen:
 

{
    "filter":[
        {
            "type":"range",
            "field":"product.stock",
            "parameters":{
        		"lt":10
            }
        }
    ]
}

Die Parameter geben dann an, welche Range du haben möchtest, es gibt die Typen: < (lt), > (gt), <= (lte),  >= (gte).
 

Gruß

Krispin

1 Like

Perfekt, funktioniert - vielen Dank!!!

Eine Frage noch: Wie funktioniert eine like-Abfrage?

Beispiel: EAN like „492542*“

Guten Morgen,

dazu gibt es dann den ContrainsFilter, z.B. eine Abfrage auf den Produktnamen, in dem ein „artikel“ stehen muss:

{
    "filter":[
        {
            "type":"contains",
            "field":"product.name",
            "value":"artikel"
        }
    ]
}

Gruß

Krispin

1 Like

Diese Filter-Geschichte lässt mir keine Ruhe, bzw. gibt es immer wieder neue Fragen / Probleme:

Wie kann man Filter miteinander kombinieren bzw. mit AND oder OR filtern?

Auf dieser Dokuseite wird der “Multifilter” erwähnt, mit dem man anscheinend zwei Filter mit AND oder OR verknüpfen:
https://docs.shopware.com/en/shopware-platform-dev-en/internals/core/data-abstraction-layer/search#multifilter

Es ist mir aber leider noch nicht gelungen den Multifilter in ein funktionierendes JSON-Format zu formatieren.

Konkretes Problem:

Filtere alle Produkte mit manufacturerId = ‘12345’ ODER manufacturerId = ‘891011’

Wie würde das JSON-Konstrukt aussehen?

 

Hi canetti2,

hast du hier schon was herausgefunden, oder soll ich mir das nochmal anschauen?
 

Gruß

Krispin

1 Like

Hallo Krispin,

vielen Dank für Deine Nachricht. Nein, leider habe ich das Problem noch nicht lösen können. Da ich genug andere Baustellen habe, die ich gerade beackere, habe ich das Problem erstmal nach hinten geschoben. Es wäre aber super nett, wenn Du Dir Geschichte noch mal anschauen könntest. Vielleicht bekommst Du ein funktionierenden JSON-String mit manufacturerId = ‘12345’ ODER manufacturerId = ‘891011’ hin?

Viele Grüße

canetti

@canetti2 schrieb:

Hallo Krispin,

vielen Dank für Deine Nachricht. Nein, leider habe ich das Problem noch nicht lösen können. Da ich genug andere Baustellen habe, die ich gerade beackere, habe ich das Problem erstmal nach hinten geschoben. Es wäre aber super nett, wenn Du Dir Geschichte noch mal anschauen könntest. Vielleicht bekommst Du ein funktionierenden JSON-String mit manufacturerId = ‘12345’ ODER manufacturerId = ‘891011’ hin?

Viele Grüße

canetti

Das sollte dann ca so aussehen:

{
    "filter":[
        {
            "type":"multi",
            "queries":[
            	{
		            "type":"equals",
		            "field":"product.manufacturerId",
		            "value":"16B356EB9AE14EB0AB5C963AB258E570"
		        },
		        {
		            "type":"equals",
		            "field":"product.manufacturerId",
		            "value":"34E6A6C9C46D4A12A77FC636F72C6A54"
		        }
        	],
            "operator":"OR"
        }
    ]
}

 

1 Like

Hallo Krispin,

das war es - perfekt, so funktioniert die Abfrage wunderbar!

Eine kleine Anmerkung noch. Bei der Angabe für “field” kann man statt product.manufacturerId auch lediglich manufacturerId angeben!

Viele Grüße und vielen Dank nochmals!

canetti

Guten Morgen Canetti2,

stimmt, habe ich ganz vergessen, gebe das iwie immer mit dem Entitätsnamen als Prefix an.
Gern geschehen.

Gruß

Krispin

@Krispin‍ ich muss diesen alten Thread nochmals aufwärmen - vielleicht kannst Du mir bei einer eigentlich einfachen Frage schnell helfen.

equals bedeutet ja die Prüfung auf GLEICHHEIT.

Wie kann ich denn bitte auf UNGLEICHHEIT prüfen? Ich habe es mit unequal, unequals oder auch not probiert - überall gibt es eine Fehlermeldung. In der sehr “schlanke” Shopware API Dokumentation habe ich auch nichts gefunden.

Konkretes Beispiel: Ich möchte nach allen Bestellungen filtern, bei denen ein Trackingcode hinterlegt ist.

                                         'type' => '???',
                                         'field' => 'trackingCodes',
                                         'value' => ''

 

Hi canetti2,

hierfür gibt es den NotFilter, in dem kannst du weitere Filter packen, sodass du dann ein Not-Equals-Filter aufbauen kannst.
https://docs.shopware.com/en/shopware-platform-dev-en/references-internals/core/dal#not

Gruß

Krispin

1 Like

@Krispin‍ erstmal 1000Dank für Deine schnelle Antwort - das ist super nett.

Bzgl. des Links mit dem PHP-Beispielcodes:

Bevor ich da jetzt wieder ewig viel Zeit reininvestiere, erlaube mir bitte noch die Frage, ob ich diesen NotFilter auch in meine API-Anfrage rein basteln kann? Ein entsprechendes Beispiel habe ich in der Shopware 6 API Doku leider nicht gefunden:
Shopware 6: Reading entities

Meine Abfrage sieht bis jetzt so ähnlich aus:

{"filter":[
{
"type":"???",
"field":"trackingCodes",
"value":""
}
]}

 

sorry ich sehe gerade - da gibt es ja einen API-Reiter - ich schau mir das noch mal in Ruhe an!!!

@Krispin‍ ich muss Dich jetzt doch noch mal bemühen:

Also ich suche nach allen Bestellungen, bei denen eine Trackingnummer hinterlegt ist. Also alle Bestellungen bei denen trackingCodes != ‘’ ist

Meine Abfrage sieht so aus:

 

{"filter":[
  {
   "type":"not",
   "queries":[
     {
        "type":"equals",
        "field":"trackingCodes",
        "value":""
     }
             ]
    }
           ]
}

Als Fehlermeldung erhalte ich:

 Parameter "value" for equals filter is missing.

Ich habe es für value auch mit false oder null probiert - leider ohne Erfolg.

Vielleicht hast Du eine Idee?

Hi canetti2,

ich habe das gerade zum Beispiel bei den Order-Feld campaignCode ausprobiert mit dem “null”-Wert und es funktioniert ohne Probleme.

{
  "filter": [
    {
      "type": "not",
      "queries": [
        {
          "type": "equals",
          "field": "campaignCode",
          "value": null
        }
      ]
    }
  ]
}

Gruß

Krispin

@Krispin‍ Dein Beispiel funktioniert in der Tat. Man kann so nach allen Werten filtern, welche vom Datentyp VARCHAR und im Standard mit NULL belegt sind.

Das von mir abgefragte Feld tracking_codes in der Tabelle order_delivery ist aber vom Datentyp json und dann funktioniert die Abfrage nach NULL nicht mehr!

{"filter":
  [
    {
     "type":"not",
     "queries":
      [
       {
        "type":"equals",
        "field":"trackingCodes",
        "value":null
       }
      ]
    }
  ]
}

Mit diesem Query werden alle Datensätze angezeigt - unabhängig davon, ob eine Trackingnummer vergeben wurde oder nicht!

Die Frage ist also, ob es eine Möglichkeit gibt, auch json-Datenbankfelder nach “Nullwerten” bzw. “NichtNullwerten” zu filtern?