turk porno porno escort rokettube
Ergebnis 1 bis 4 von 4

Thema: Query mit nest und Schleifen (loops)

  1. #1
    Neuer Benutzer
    Registriert seit
    15.04.2015
    Ort
    Südlich von München
    Beiträge
    28
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard Query mit nest und Schleifen (loops)

    Hallo Zusammen,

    ich häng mal wieder...

    Folgendes Problem:
    Ich möchte für eine Suchfunktion eine Query mit einer dynamischen Anzahl von OR Verknüpfungen innerhalb einer Klammer (nest) bauen.
    Eigentlich schien mir das recht einfach - ich wollte einfach ein Schleife benutzen.
    Aber Schleifen werden wohl von nest() nicht unterstützt.

    Hier meine ursprüngliche Idee:
    PHP-Code:
                $select $sql->select();
                
    $select->from('o_orders');
                     
                
    $where = new Where();

                
    // Only search for not deleted orders
                // and start nesting loop
                
    $where
                    
    ->equalTo('oo_deleted'0)
                    ->
    and
                    
    ->nest();
                    
                
    // Add customerids and customertype to search
                // (I fetch customers through query and dont know number of customers)
                
    if(($customer->count()) != 0) {
                
                    
    $ii 0;
                    foreach (
    $customer as $customerx) {
                        if (
    $ii != 0)   {
                            
    $where->or;
                        }
                        
    $where
                        
    ->nest()
                        ->
    like('oo_customerid'$customerx['cu_id'])
                        ->
    and
                        
    ->like('oo_customertype'$customerx['cu_ctype'])
                        ->
    unnest();
                        
    $ii++;
                    }
                }
                
    // End nesting loop
                
    $where->unnest();

                
    $statement $sql->prepareStatementForSqlObject(
                    
    $select->where($where)
                );
                
    // Check wether sql-statement is properly build
                
    var_dump($statement->getSql());
                die(
    'oderssearch'); 
    Entgegen meinen Erwartungen bekomme ich die Fehlermeldung: 'Not nested'.
    In verschiedenen Versuchen habe ich herausbekommen, dass die erste öffnende Klammer zwar geschrieben wird, aber ohne Inhalt auch wieder geschlossen.
    Die Schleife und auch das Nesting in der Schleife werden richtig gebaut.
    Das letzte Unnest findet aber natürlich keine offene Klammer mehr - die wurde ja gleich wieder geschlossen.

    Im Internet habe ich folgenden Workaround gefunden, der auch funktioniert:
    PHP-Code:
                $select $sql->select();
                
    $select->from('o_orders');

                
    $where = new Where();
                
                
    // Build a strliteral for adding customerids and customertype to search
                
    $strLiteralCu '';
                if((
    $customer->count()) != 0) {
                
                    
    $ii 0;
                    foreach (
    $customer as $customerx) {
                        if (
    $ii != 0)   {
                            
    $strLiteralCu .= " OR ";
                        }
                        
    $strLiteralCu .= "(oo_customerid = " $customerx['cu_id'] . " ";
                        
    $strLiteralCu .= "AND oo_customertype LIKE '" $customerx['cu_ctype'] . "')";
                        
    $ii++;
                    }
                }

                
    // Start buildig whereclause        
                
    $where
                
    // Only search for not deleted orders
                
    ->equalTo('oo_deleted'0)
                ->
    and
                
    ->nest()
                
    // add search for customerid
                
    ->literal($strLiteralCu)
                ->
    unnest(); 
    Das funktioniert zwar, ist aber nicht sehr schön.
    Gibt es dafür eine bessere Lösung?

    Viele Grüße und Dank im Voraus,
    Schneeloewe

  2. #2
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.520
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von schneeloewe Beitrag anzeigen
    Aber Schleifen werden wohl von nest() nicht unterstützt.
    Deine Handhabung ist nur falsch.


    Zitat Zitat von schneeloewe Beitrag anzeigen
    Das funktioniert zwar, ist aber nicht sehr schön.
    Das ist sogar Unsinn!

    Geht viel einfacher. Beispiel:
    PHP-Code:
    $predicate = new \Zend\Db\Sql\Predicate\Predicate();
    foreach (
    $resultSet as $row) {
        
    $predicate->OR->equalTo('id'$row->id);
    }
    $select->where->addPredicate($predicate); 
    Und schon hast du deine Klammern. Damit ersparst du dir auch die Verwendung der Methoden „nest“ und „unnest“.
    Geändert von Kaiuwe (13.07.2016 um 11:13 Uhr)
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

  3. The Following User Says Thank You to Kaiuwe For This Useful Post:

    schneeloewe (20.07.2016)

  4. #3
    Neuer Benutzer
    Registriert seit
    15.04.2015
    Ort
    Südlich von München
    Beiträge
    28
    Thanks
    2
    Thanked 0 Times in 0 Posts

    Standard

    Servus Kaiuwe,

    erstmal wieder ein herzliches DANKSCHÖN,
    hätt ich auch selber draufkommen können...

    Für mich war das Predicate ein Alien vom fremden Stern - obwohls wirklich einfach ist und gut funktioniert.

    Der Ordnung halber hier mein neuer und funktionierender Code:
    PHP-Code:
                $select $sql->select();
                
    $select->from('o_orders');

                
    $where = new Where();
                
                
    // Predicate for conditions in nest()
                
    $predicate = new Predicate();

                if((
    $customer->count()) != 0) {
                
                    
    $ii 0;
                    foreach (
    $customer as $customerx) {
                        if (
    $ii != 0)   {
                            
    $predicate->OR->equalTo('oo_customerid'$customerx['cu_id']);
                            
    $predicate->AND->equalTo('oo_customertype'$customerx['cu_ctype']);
                        } else {
                            
    $predicate->equalTo('oo_customerid'$customerx['cu_id']);
                            
    $predicate->AND->equalTo('oo_customertype'$customerx['cu_ctype']);
                        }
                        
    $ii++;
                    }
                }

                
    // Start buildig whereclause        
                
    $where
                
    // Only search for not deleted orders
                
    ->equalTo('oo_deleted'0)
                ->
    and
                
    ->nest()
                
    // add search for customerid
                
    ->addPredicate($predicate)
                ->
    unnest(); 
    Dankschön nochmal, ich hak die Frage dann mal ab

    LG schneeloewe

  5. #4
    Super-Moderator Avatar von Kaiuwe
    Registriert seit
    30.12.2006
    Beiträge
    5.520
    Thanks
    4
    Thanked 356 Times in 287 Posts

    Standard

    Zitat Zitat von schneeloewe Beitrag anzeigen
    Für mich war das Predicate ein Alien vom fremden Stern - obwohls wirklich einfach ist und gut funktioniert.
    Das Ganze ist leider nicht dokumentiert und daher muss man sich selber in den Code einlesen.
    Zum Zend Framework stehen jedem folgende Quellen zum Nachschlagen zur Verfügung:

Ähnliche Themen

  1. Problem mit Umlauten aus Formular und Query
    Von mklimaschewski im Forum DB
    Antworten: 1
    Letzter Beitrag: 27.08.2009, 08:12
  2. Array durch 2 foreach loops erhalten?
    Von 11&2 im Forum Einsteigerfragen
    Antworten: 2
    Letzter Beitrag: 31.03.2009, 13:16
  3. Logik im View (Schleifen, Funktionen)
    Von # eof im Forum Einsteigerfragen
    Antworten: 14
    Letzter Beitrag: 28.12.2007, 12:37
  4. Antworten: 9
    Letzter Beitrag: 23.09.2007, 11:44
  5. Array durch Form schleifen
    Von TeeJay im Forum Formulare
    Antworten: 4
    Letzter Beitrag: 04.06.2007, 14:58

Stichworte

Lesezeichen

Berechtigungen

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