Magento: Problem mit addFieldToFilter

29. Januar 2016

Nach dem Einspielen einiger Patches in Magento 1.9.0.1 machte eine Extension einer Drittpartei plötzlich Probleme, beim Aufrufen der zugehörigen Seite warf Magento folgende Fehlermeldung aus:

  1. SQLSTATE[42S22]: Column not found: 1054 Unknown column 'CAST(CONCAT(year, "-", month, "-01") AS DATE)' in 'where clause'

das hatte vorher einwandfrei funktioniert und weil Magento super ist, habe ich anstatt ewig zu googeln einfach in Mage und Varien gegraben und die Ursache in lib/Varien/Data/Collection/Db.php gefunden. In der Extension der Drittpartei gab es folgendes Konstrukt:

  1. $entry->addFieldToFilter('CAST(CONCAT(year, "-", month, "-01") AS DATE)', array('from' => $fromDate, 'to' => $toDate));

Seit dem Patch macht addFieldToFilter aber etwas anders, es setzt nämlich alle übergebenen Werte erstmal in Quotes, und dann sieht die Query so aus:

  1. SELECT * FROM table WHERE `CAST(CONCAT(year, "-", month, "-01") AS DATE)` ...

Durch die Quotes nimmt MySQL dann an, dass es sich um eine Spalte handelt und kann die natürlich nicht finden. Man muss also dafür sorgen, dass addFieldToFilter so einen Wert nicht in Quotes packt, und dafür gibt es eine Möglichkeit. Bevor ein Wert in Quotes gesetzt wird, wird überprüft, ob in $this->_map nicht vielleicht ein Eintrag für diesen Wert drin ist, und wenn hier was drinsteht, dann werden die Anführungszeichen weggelassen. Weil es recht eilig war, habe ich mir also hiermit beholfen:

  1. $entry->addFilterToMap('CAST(CONCAT(year, "-", month, "-01") AS DATE)', 'CAST(CONCAT(year, "-", month, "-01") AS DATE) '); //mit einem leerzeichen danach
  2. $entry->addFieldToFilter('CAST(CONCAT(year, "-", month, "-01") AS DATE)', array('from' => $fromDate, 'to' => $toDate));

Und damit klappt’s dann auch. Ich bin sicher, wie ich das handhabe ist es nicht optimal, aber zwischenzeitlich hats mir den Arsch gerettet.