Ergebnis 1 bis 9 von 9

Thema: Eigener SQL Filter - ORDER BY wird ignoriert

  1. #1
    Contao-Nutzer
    Registriert seit
    23.06.2009.
    Beiträge
    200

    Standard Eigener SQL Filter - ORDER BY wird ignoriert

    Ich habe ein seltsames Problem und zwar wird mir bei meinem Metamodel die ORDER BY Sortierung
    einfach komplett ignoriert:

    Eigener SQL Code:
    HTML-Code:
    SELECT * FROM {{table}} WHERE cat_id = {{param::filter?name=cid}} ORDER BY sorting
    Wenn ich in Contao das Debugging aktiviere und mir die SQL Query raussuche,
    passt noch alles:

    HTML-Code:
    SELECT * FROM mm_test WHERE cat_id = 1 ORDER BY sorting
    Im Template selbst ist dann aber schon Schluss mit der Sortierung, wenn ich mir
    das objItems Array einmal anschaue:

    HTML-Code:
    function getProjectsByCategory($categoryId, $format='html5')
    {
         $objMetaModel =  \MetaModels\Factory::byTableName('mm_test');
         $objFilter = $objMetaModel->prepareFilter(7, array('cid' => $categoryId));
         $objItems = $objMetaModel->findByFilter($objFilter);
         print_r($objItems);
         return $objItems->parseAll($format, $objMetaModel->getView(5));
    }
    Die Ausgabe mittels print_r($objItems) liefert das schon falsch sortierte/unsortierte
    Array zurück. Hat da vielleicht jemand einen Tipp, woran das liegen könnte?
    Schön langsam gehen mir ein wenig die Ideen aus.

    Vielen Dank und beste Grüße
    Sares

  2. #2
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    der Filter 7 ist korrekt?

    was steht in $objFilter?

    teste mal mit

    PHP-Code:
    $objFilter $objMetaModel->prepareFilter(7, array('cid' => 1)); 

  3. #3
    Contao-Nutzer
    Registriert seit
    23.06.2009.
    Beiträge
    200

    Standard

    Hallo Zonky,

    vielen Dank für Deine Antwort.

    Ja, der Filter 7 ist korrekt und es erfolgt ja auch die richtige Ausgabe der Daten,
    nur sind die eben nicht richtig sortiert. Der Filter 7 ist übrigens der hier:

    HTML-Code:
    SELECT * FROM {{table}} WHERE cat_id = {{param::filter?name=cid}} ORDER BY sorting
    Wie gesagt, im Debugging Modus sehe ich, dass die Query auch so abgesetzt wurde.

    Gebe ich mal objFilter aus, steht da folgendes:

    HTML-Code:
    MetaModels\Filter\Filter Object ( [strMetaModel:protected] => mm_test [arrFilterRules:protected] => 
    Array ( [0] => MetaModels\Filter\Rules\SimpleQuery Object ( [strQueryString:protected] => 
    SELECT id FROM mm_test WHERE published=? [arrParams:protected] => Array ( [0] => 1 ) 
    [strIdColumn:protected] => id ) [1] => MetaModels\Filter\Rules\SimpleQuery Object ( [strQueryString:protected] => 
    SELECT * FROM mm_test WHERE cat_id = ? ORDER BY sorting ASC 
    [arrParams:protected] => Array ( [0] => 17 ) [strIdColumn:protected] => id ) ) 
    [arrMatches:protected] => Array ( [0] => 1 [3] => 3 [27] => 26 ) )
    Auch hier scheint noch alles soweit zu passen, nur die Daten selbst sind eben dann nicht
    in der richtigen Reihenfolge sortiert. Teste ich die Query direkt am MySQL Server passt
    alles.

    Ich hab echt keine Ahnung, warum dann genau hier:

    HTML-Code:
    $objItems = $objMetaModel->findByFilter($objFilter);
    die Daten dann falsch sortiert ankommen.

    Ich habe heute zur Sicherheit auch noch einmal das Testweb dupliziert
    und die MM via Composer aktualisiert (Contao 3.3.5, MM dev-tng).
    Hat aber leider auch nichts gebracht, die Daten sind auch dort unsortiert.

  4. #4
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    bitte die Ausgaben wie "MetaModels\Filter\Filter Object..." entweder aus dem Quelltext kopieren oder mit <pre>...</pre> auf der Seite "formatiert" ausgeben

    => wer soll den das Lesen können!?!?

  5. #5
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    ... sind das Deine Items

    PHP-Code:
    [arrMatches:protected] => Array ( [0] => [3] => [27] => 26 
    1, 3, 27 ist nicht Deine ASC == aufsteigende Sortierung?

  6. #6
    Contao-Nutzer
    Registriert seit
    23.06.2009.
    Beiträge
    200

    Standard

    Hallo Zonky,

    ja, die Einträge 1,3 und 26 bilden für diese Kategorie das Result-Set.
    Nach der "Sortierung" müsste das allerdings 3,1,26 sein und so (3,1,26)
    kommen Sie auch an, wenn ich die Anfrage direkt in der Datenbank mit SQL mache.

    Was aber auf den ersten Blick vielleicht täuscht, ist die Tatsache, dass das
    Result-Set hier nach ID sortiert ist. Das ist purer Zufall. Frage ich eine etwas
    umfangreichere Kategorie ab, ist das Result-Set folgendes:

    4,5,17,22,36,37,80,39,62

    Ich bin aber selbst noch nicht drauf gekommen, nach welchen
    Kriterien MySQL sortiert, wenn kein Order By mit angegeben wird,
    das Resultat zwischen den MM und einer SQL-Query OHNE Order By
    ist somit ident.

    Also MM Abfrage:

    HTML-Code:
    SELECT * FROM mm_test WHERE cat_id = 1 ORDER BY sorting
    liefert das gleiche Ergebnis wie SQL:

    HTML-Code:
    SELECT * FROM mm_test WHERE cat_id = 1
    somit ist eigentlich offensichtlich, dass die MM irgendwie das ORDER BY entweder ignorieren
    oder vielleicht irgendwie wegfiltern, keine Ahnung.

  7. #7
    Contao-Urgestein Avatar von zonky
    Registriert seit
    19.03.2010.
    Ort
    Berlin, Rdf
    Beiträge
    9.719
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von Sares Beitrag anzeigen
    Ich bin aber selbst noch nicht drauf gekommen, nach welchen
    Kriterien MySQL sortiert, wenn kein Order By mit angegeben wird,
    bin mir nicht sicher, aber würde sagen, so wie die Daten in der Tabelle eingespeichert sind "von Oben nach Unten"

    da keiner das Debugging bei Dir übernehmen kann, würde ich ein Ticket bei Github absetzen und die Sortierung (als temp. Workaround) selbst über eine Arrayfunktion machen...


    ... hast Du mal den Filter direkt ausprobiert - also ohne die Programmierung im Template?

  8. #8
    Maintainer Avatar von xtra
    Registriert seit
    02.07.2009.
    Ort
    Tuebingen
    Beiträge
    2.007
    User beschenken
    Wunschliste

    Standard

    Mach es doch bitte mit den vorgegebenen Bordmitteln:
    PHP-Code:
    function getProjectsByCategory($categoryId$format='html5')
    {
         
    $objMetaModel =  \MetaModels\Factory::byTableName('mm_test');
         
    $objFilter $objMetaModel->prepareFilter(7, array('cid' => $categoryId));
         
    $objItems $objMetaModel->findByFilter($objFilter'sorting');
         return 
    $objItems->parseAll($format$objMetaModel->getView(5));

    Beachte den zweiten Parameter, "sorting". So sortierst du korrekt in MetaModels.

    Dein Problem ist dass du zwei Filter hast:
    Code:
    SELECT id FROM mm_test WHERE published=1
    
    SELECT * FROM mm_test WHERE cat_id = 17 ORDER BY sorting ASC
    Das erste ist der published filter, der liefert die ersten ids, welche bei dir dann auch die Reihenfolge bestimmen. Der zweite ist dann dein Filter, mittels welchem du gerne sortieren wyrdest.

    Aber wie oben bereits geschrieben ist sowas "von hinten durch die Brust ins Auge", da man MetaModels direkt sagen kann wonach man sortieren moechte.

    Auszug aus IMetaModel.php:
    PHP-Code:
        /**
         * Filter the MetaModel by the provided filter settings.
         *
         * @param IFilter|null $objFilter    The filter object to use or null if none.
         *
         * @param string       $strSortBy    Optional name of the attribute the entries shall be sorted.
         *
         * @param int          $intOffset    Optional offset for the first item.
         *
         * @param int          $intLimit     Optional amount of items to retrieve.
         *
         * @param string       $strSortOrder Optional sorting direction, either 'ASC'(default) or 'DESC'.
         *
         * @param string[]     $arrAttrOnly  Names of the attributes that shall be enclosed in the result, defaults to
         *                                   empty which means all attributes.
         *
         * @return IItems The collection of IItem instances that match the given filter.
         */
        
    public function findByFilter(
            
    $objFilter,
            
    $strSortBy '',
            
    $intOffset 0,
            
    $intLimit 0,
            
    $strSortOrder 'ASC',
            
    $arrAttrOnly = array()
        ); 
    Gruss
    Chris
    Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.

  9. #9
    Contao-Nutzer
    Registriert seit
    23.06.2009.
    Beiträge
    200

    Standard

    Super, vielen Dank für die ausführlichen Erläuterungen, ich gelobe hiermit Besserung :-)

    Jetzt nach Deinen Ausführungen habe ich noch ein wenig mit den Filter herumgespielt.
    Deaktiviert man den Publishing Filter oder reiht ihn nach dem "Eigenen SQL Filter",
    dann passt auch in meinem Fall die Sortierung und funktioniert, was aber eh klar ist.

    Jedenfalls vielen Dank und beste Grüße
    Sares

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •