Filtern Sie eine Sammlung nach NOT FIND_IN_SET

7

Ich muss eine Sammlung nach einem Negativ filtern FIND_IN_SET.

Ich weiß, ich kann dies tun:

$collection->addAttributeToFilter(
    'attribute_code',
    [['finset' => 4], ['null' => true]]
);

Dies filtert die Sammlung nach FIND_IN_SET(...) OR value IS NULL. Aber das FIND_IN_SETmuss negativ sein ( NOT FIND_IN_SET). Wie kann ich das erreichen?

Muss ich dafür wirklich einen Custom erstellen Zend_Db_Expr?

Edit: Nach der Antwort von @Marius habe ich das mit gelöst Zend_Db_Expr. Für den Fall, dass jemand anderes auf dieses Problem stößt, habe ich es folgendermaßen gelöst:

$collection->getSelect()->where(
    new \Zend_Db_Expr(
        sprintf('NOT FIND_IN_SET(%1$d, at_excluded_customer_groups.value) OR at_excluded_customer_groups.value IS NULL',
            $customerGroupId
        )
    )
);

Meine Situation bestand darin, nach Kundengruppen-ID oder NULL zu filtern.

Giel Berkers
quelle
Sie können Ihre Lösung gerne als Antwort veröffentlichen, damit Sie sie akzeptieren können. Leute können es vermissen, wenn Sie es in Ihrer Frage behalten
Raphael bei Digital Pianism

Antworten:

7

Ich denke du musst ein dafür erstellen Zend_Db_Expr.
Es gibt keine Unterstützung für NOT FIND_IN_SET.
Sie können alle unterstützten Bedingungen in sehen Varien_Db_Adapter_Pdo_Mysql::prepareSqlCondition.

    $conditionKeyMap = array(
        'eq'            => "{{fieldName}} = ?",
        'neq'           => "{{fieldName}} != ?",
        'like'          => "{{fieldName}} LIKE ?",
        'nlike'         => "{{fieldName}} NOT LIKE ?",
        'in'            => "{{fieldName}} IN(?)",
        'nin'           => "{{fieldName}} NOT IN(?)",
        'is'            => "{{fieldName}} IS ?",
        'notnull'       => "{{fieldName}} IS NOT NULL",
        'null'          => "{{fieldName}} IS NULL",
        'gt'            => "{{fieldName}} > ?",
        'lt'            => "{{fieldName}} < ?",
        'gteq'          => "{{fieldName}} >= ?",
        'lteq'          => "{{fieldName}} <= ?",
        'finset'        => "FIND_IN_SET(?, {{fieldName}})",
        'regexp'        => "{{fieldName}} REGEXP ?",
        'from'          => "{{fieldName}} >= ?",
        'to'            => "{{fieldName}} <= ?",
        'seq'           => null,
        'sneq'          => null
    );

Wie Sie sehen können, gibt es nichts Vergleichbares zu dem, was Sie brauchen.

Marius
quelle
Danke für deine Antwort. Ich habe diese Liste zwar gesehen, mich aber gefragt, ob es einen Filter oder eine Inversionsmethode gibt, die diese überschreiben kann. Ich habe es in der Zwischenzeit mitZend_Db_Expr
Giel Berkers
1

Die Verwendung ninmit einem Array von Werten sollte meiner Meinung nach ausreichen:

$collection->addAttributeToFilter(
    'attribute_code',
    [['nin' => [4, 5]], ['null' => true]]
);
Raphael beim digitalen Pianismus
quelle
3
Dies funktioniert nicht, wenn die Werte des Attributs für ein Produkt in einer einzelnen durch Komma verketteten Spalte gespeichert sind 1,2,3,4. Das macht der Fund im Set. Es teilt den Wert durch Komma und sucht nach übereinstimmenden Werten.
Marius
@Marius hmmm ja das macht Sinn. Da das OP nur einen Wert lieferte, war ich mir nicht sicher, warum er find_in_set
Raphael bei Digital Pianism
weil er alle Werte aus dem Feld haben möchte 1,2,3, das keine 4 enthält.
Marius
Ihr habt Recht, es geht nur um Mehrfachauswahlwerte, die in der Varchar-Tabelle gespeichert sind ... Diese werden durch ein Komma getrennt, und ich möchte rohe SQL-Leistung verwenden, um dies zu filtern, und nicht mehrere Abfragen durchführen.
Giel Berkers
und deshalb saugt
magento