Magento Collections und addFilter()

| 6 Kommentare

Magento ist eine typische Hassliebe. Ein paar Sachen sind super und andere gehören eindeutig in die Kategorie W.T.F.

So zum Beispiel auch die Arbeit mit Magento Collections.

Als Magentoentwickler sind wir es ja gewohnt, das uns das Model einfach eine Collection gibt, mit der wird dann nach Lust und Laune weiter arbeiten können.

<?php
$collection = Mage::getModel('sales/order')->getCollection();

Ebenso bequem lassen sich einfache Standardfilter vor dem Laden setzen, z.B. wenn wir nur Orders mit der StoreId = 42 haben wollen.

<?php
$collection->addFilter('store_id', 42);

So weit, so gut… Nun könnte man als verrückter Entwickler nun auch plötzlich auf die Idee kommen, nur Elemente laden zu wollen, deren StoreId größer oder kleiner ist.

Intuitiv hätte ich jetzt Konstrukte wie bei quoteInto() erwartet

<?php
$collection->addFilter('store_id < ?', 42);

oder vielleicht auch noch einen dritten Parameter der den Vergleichsoperator bekommt

<?php
$collection->addFilter('store_id', 42, '<');

Aber nichts dergleichen ist im Angebot. Dafür aber ein, zumindest für mich, wirres Konstrukt.

<?php
$collection->addFilter(null, 'id >' . $this->getLastId(), 'string');

Der erste Parameter $field fliegt raus, bzw. kann leer übergeben werden und dafür bauen wir uns unsere Bedingung selber zusammen und übergeben sie an den zweiten Parameter $value, was in der Folge schon fast wieder einen Sinn ergibt, weil wir dem dritten Parameter $type den Wert string (als String) zuweisen.

Für mich eindeutig W.T.F.! Liebe Entwickler bei Varien, ich habe keine Ahnung was die Quelle eurer Inspiration und Kreativität ist, aber versucht es doch mal mit etwas anderem. ;-)

6 Kommentare

  1. Hi Daniel,
    was spricht gegen die Methode addFieldToFilter oder addAttributeToFilter?
    Diesen Methoden kannst du eine Condition übergeben.
    Die Conditions werden dann intern über _getConditionSql in der Klasse Varien_Data_Collection_Db umgesetzt.

    Gruß
    Matthias

  2. Es geht mir dabei eher darum, dass Magento sowas seltsames anbietet, wenn es doch die beiden anderen Methoden gibt.

  3. Kleiner Hinweis am Rande: Varien gibts nicht mehr, die heissen seit einiger Zeit Magento Inc. ;-)

  4. Und was hat sich außer dem Namen noch geändert? :)

  5. Nix, der Code bleibt so schlecht wie er war ;-)

  6. Hallo,

    korrekt würder der > Filter mit

    $collection->addFieldToFilter(‘store_id’, array(‘gt’ => 42))

    der Collection hinzugefügt.
    Die Syntax für die Filter (gt, lt, notnull, …) sind zu finden in
    Varien_Data_Collection_Db in der Methode _getConditionSql()

    Gruß,

    Vinai

Hinterlasse eine Antwort

Pflichtfelder sind mit * markiert.


Schlagwörter: A/B-Test, AbstractType, Adapter, AddOn, Administration, Ajax, Amazon, Animation, Annotations, Anonyme Klasse, Ant, Apache, API, Array, ArrayAccess, Attachment, Auftrag, Ausbildung, Auswertung, Authentifizierung, AutoLoader, AWS, Bedienung, Bedingung, Benchmark, Berechtigung, Berlin, Bildbearbeitung, Bildschirmfoto, Blog, Blogroll, BOM, Bootstrap, Bot, Browser, Bugtracker, Byte Order Mark, Bücher, Cache, CakePHP, Call-Center, Callback, CamelCase, Canvas, Captcha, CDN, Cheatsheet, CLI, Clickout, Closure, Cloud, CodeSniffer, Collection, Community, Comparator, Config, Contest, Controller, Converter, CouchDB, Countable, Cronjob, CRUD, CSS, CSV, CustomLibrary, Custom_Model, Daemon, Data Mapper, Datei, Datenbank, Datenstruktur, Datentypen, Dating, Datum, Debug, Decorator, Dekorierer, Design, Design Patterns, Doctrine, Dokumentation, Dump, Duplikat, each, EC2, Eclipse, Email, Entwicklung, Entwurfsmuster, Enum, Erweiterung, Event, Eventhandling, Exception-Handling, Extension, Facebook, Factory, Fallback, Fehler, Fehlermeldung, Filter, Firefox, Flash, flexigrid, Foreach, Formatierung, Formular, Framework, FTP, Funktion, Futon, ga:pi(), Getter, Google Analytics, Hash, Hash-Bang, Header, htaccess, HTML5, htpasswd, HTTP, HTTPS, IDE, If, Implementierung, InnoDB, Interceptor, Interface, Internet Explorer, isset, Iterator, Java, JavaScript, Job, jQuery, Kommentar, Konfiguration, Konsole, Kontrollstruktur, kopieren, kostenlos, Kundenbetreuung, Late Static Binding, Layout, Links, Linux, Listeners, Lizenz, Logging, Löschen, Magento, Magic Methods, Manual, ManyToMany, Marketing, Methode, Model, Monolog, MVC, MySQL, NetBeans, Network, Nirvanix, Objekt, Observable, Observer, OneToMany, Online Tool, OOP, Open Source, Operator, OR-Mapper, Order, ORM, O’Reilly, Parameter, Partnersuche, Passwort, Performance, PHP, php.ini, PHP hates me, phpMyAdmin, PHPUnit, Plugin, Popup, Proxy, Prüfsumme, Prüfung, QR-Code, Qualitätssicherung, Query, Queue, Redesign, Refactoring, Reflection, Request, Response, Responsive Design, Rest-API, Rockstar, Rollback, Routing, S3, Samba, Scheifen, Schleife, Schutz, Screenshot, Secure Shell, Selbstreferenz, Server, Setter, setTimeout, Shop, Sicherheit, Sicherung, Sichtbarkeit, Singleton Pattern, Skin, SOAP, Social Network, Software, Sortierung, Sourcecode, Spam, Speicherproblem, Spickzettel, SPL, Splittest, SSH, SSL, Stammtisch, Statement, static, Statistik, Status, Stellvertreter, Strategy Pattern, Stream, String, Stuttgart, Stylesheet, Subversion, Sun VirtualBox, Support, SVN, Switch, Symfony, Symfony2, Symfony Live, Tag, Template, Template Method, Ternär Operator, Testing, Theme, Thumbnail, Tool, Tour, Tracking, Twig, Twitter, Type-Cast, Ubuntu, Umwandlung, Underscore, unset, Update, Upload, Url, User Story, Validierung, Vererbung, Versionskontrolle, Versionsnummer, Verzweigung, Video, Videospiel, Virtualisierung, Visitor Pattern, Vorschaubild, walk, Warteschlange, Webserver, Webservice, Weiterleitung, Werkzeug, Windows, WindowsAzure, WordPress, Wrapper, Writer, XML, Youtube, Zeitschleife, Zeitsteuerung, Zend Framework, Zend_Application, Zend_Cloud, Zend_CodeGenerator, Zend_Http_Client, Zend_Reflection, Zend_Service, ZPress, Zugangskontrolle, Zugriffsmethode