API veroderung bei ein und der selben Property

Hallo Leute 

ich habe eine frage zu den Filtern bei der API, in der Doku ist hier dieser abschnitt beschrieben 

https://developers.shopware.com/developers-guide/rest-api/#filter,-sort,-limit,-offset

Hier wird mit einem Bespiel beschreiben wie man einen veroderten Filter auf zwei unterschiedliche Propertys anwendet

 

$params = [

          ‘filter’ => [

              [ ’

                      property’ => ‘name’,

                      ‘value’ => ‘%beach%’,

                      ‘operator’ => 1

              ],

              [         ‘property’ => ‘active’,

                         ‘value’ => 1

               ] 

        ]

];

 

$client->get(‘articles’, $params);

 

Jedoch würde ich gerne in ein und die selbe property nach zwei  unterschiedlichen values verordert filtern.

Quasi will ich das hier ausführen.

$params = [

          ‘filter’ => [

              [ ’

                      property’ => ‘name’,

                      ‘value’ => ‘%beach%’,

                      ‘operator’ => 1

              ],

              [         ‘property’ => ‘name’,

                         ‘value’ => ‘%ocean%’

               ] 

        ]

];

und damit alle Artikel mit den value ocean ODER beach ausgegeben haben.

Wenn ich da aber bei mir ausführe überschreibt einfach die zweite property die erste, es werden also nur alle Artikel mit Ocean ausgegeben.

 

Stand jemand von euch schon vor denselben problem das er in ein und der selben property nach zwei werten verodert Filtern möchte und wenn ja wie habt ihr es gelöst ?

 

Danke im Vorraus

Hi,

habe ich jetzt nicht getestet, aber so wie ich das im Quellcode sehe (/engine/Shopware/Components/Model/QueryBuilder.php::149) könntest du mal versuchen, den “operator” auch beim zweiten Wert mit anzugeben. Doctrine geht die Filter nach und nach durch und fügt die mit andWhere hinzu – es sei denn, “operator” evaluiert “true” auf “isset”. Von daher müsste man das eigentlich bei jdem Filter mit angeben, wenn alles “or” sein soll.

Aber wie gesagt: Nicht getestet. 

Besten Gruß

Daniel

1 „Gefällt mir“

Hallo zusammen,

leider stehe ich vor dem selben Problem, dass die zweite property die erste überschreibt…

Dadurch werden leider nicht alle Artikel aus der Abfrage ausgegeben!

Wenn ich da aber bei mir ausführe überschreibt einfach die zweite property die erste, es werden also nur alle Artikel mit Ocean ausgegeben.

Ich habe bei beiden „operator“ => 1 gesetzt!

Muss man noch etwas bestimmtes beachten?

Vielen Dank im Voraus!

Hallo @wirthmaster‍,

das erste Filter würde immer ignoriert das ‚operator‘ , weil es ist das erste Abfrage beim Where clause.

also Ihre Filter Array würde etwas wie so genierern:

WHERE article.name LIKE '%beach%' AND article.name LIKE '%ocean%'

ich glaube ob Sie haben nochmal das Artikels überprüfen , dann Sie haben nur das Artikel mit ‚ocean‘ und ‚beach‘ in seiner Namen.

Also um ‚OR‘ zu nehmen, verschieben Sie das ‚operator‘ zu das nächst Abfrage:

OR => ‚operator‘ mit die nächste Wert

AND => keine ‚operator‘ key

z.B.:

1-  ( ‚beach‘ OR’ocean’ ) =>  ‚or‘ hier mit die nächst Wert verbinden

deine Array würde wie so sein:

$params = [
    'filter' => [
        [
            'property' => 'name',

            'value' => '%beach%',

        ],

        [
            'property' => 'name',

            'value' => '%ocean%',
            'operator' => 1

        ],

    ]
];

dann beim Sql haben Sie:

WHERE article.name LIKE '%beach%' OR article.name LIKE '%ocean%'

2-  ( ‚beach‘ OR’ocean’  AND isActive ) => 

‚or‘ hier mit die nächst Wert verbinden

‚AND‘ keine ‚operator‘

deine Array würde wie so sein:

$params = [
    'filter' => [
        [
            'property' => 'name',

            'value' => '%beach%',

        ],

        [
            'property' => 'name',

            'value' => '%ocean%',
            'operator' => 1

        ],

        [
            'property' => 'active',
            'value' => '1',
        ],

    ]
];

=> SQL:

WHERE (article.name LIKE '%beach%' OR article.name LIKE '%ocean%') AND article.active LIKE '1'

VG,

Tel.: +49 755 - 183 990 00 | Email: info@enbit.de | Web: http://enbit.de/

Hallo ahmadsaad,

vielen Dank für deine Antwort!
Leider wird bei mir weiterhin die erste property von der zweiten überschrieben…

Könntest Du bitte einmal den Link posten, der bei deiner Abfrage erzeugt wird?

Vielen Dank!

Hallo @malesi‍,

hier ist meine Link , ich benutze die gleiche Array oben.

http://mylocalshop.test/api/articles?filter%5B0%5D%5Bproperty%5D=name&filter%5B0%5D%5Bvalue%5D=%25beach%25&filter%5B1%5D%5Bproperty%5D=name&filter%5B1%5D%5Bvalue%5D=%25ocean%25&filter%5B1%5D%5Boperator%5D=1&filter%5B2%5D%5Bproperty%5D=active+%3D1+OR+mainDetail.inStock&filter%5B2%5D%5Bexpression%5D=%3E&filter%5B2%5D%5Bvalue%5D=0

welche Shopware version haben Sie??

VG,

Tel.: +49 755 - 183 990 00 | Email: info@enbit.de | Web: http://enbit.de/