Ankündigung

Einklappen
Keine Ankündigung bisher.

PDO-Vorlagenklasse

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PDO-Vorlagenklasse

    Hallo alle zusammen,
    ich quäle mich in letzter Zeit viel mit Datenbankzugriffen rum und mir war das ständige Copy & Paste und das damit verbundene Abändern müssen viel zu blöd auf Dauer. Mittlerweile hab ich für bestimmt zwei dutzend Module mit je mindestens einer DB_Tabelle jeweils select, insert, update, delete usw. -Anfragen erstellt.
    Aus diesem Grund hab ich mich entschlossen ein kleines Script zu schreiben, welches alle diese Anfragen quasi selbst erstellt und direkt als Quellcode für PHP ausgibt. Da ich obkjektorientiert arbeite, besteht der generierte Quellcode aus einer Klasse mit je einer Methode für jede Query. Mir ist bewusst, dass die Profis hier wahrscheinlich kein Interesse an dem Script haben, aber mein Gedanke ging auch eher an die Anfänger, die sich mit PDO beschäftigen wollen. Ich biete also hier den Quellcode kostenlos an. Es wäre ja blödsinnig sich so viel Arbeit zu machen und es dann nur für sich selber zu nehmen, wo es doch andere vllt auch brauchen könnten.

    Features:
    Dieses Script generiert Abfragen. Es erkennt selbstständig die Primary und Unique- Spalten und nutzt sie zur Identifizierung des Datensatzes beispielsweise bei update. Es werden außerdem prepared-stmts generiert, wenn es auswahl- bzw Eingabeparameter gibt. Dabei wird der vorgeschriebene Datentyp der Spalte als Grundlage für den zulässigen Datentyp bei der Funktion bindParam() verwendet und die entsprechende PDO-Konstante eingetragen.

    Vorraussetzungen:
    Man benötigt dafür min. PHP 5.1 oder neuer mit PDO-Treiber . Natürlich braucht man auch eine Datenbank, sollte klar sein.
    Die Tabelle, welche analysiert wird, muss fertig eingerichtet sein, also eine Primary- oder zumindest eine Unique-spalte beinhalten.
    Ich nutze immer eine Spalte id als Primary mit auto_increment.
    Das Script muss Zugang zur Tabelle bekommen um sie auswerten zu können. Folglich müssen also alle wichtigen (Zugangs-)Daten im Script stehen.

    Bemerkungen:
    Ich würde mich übrigens sehr über Verbsesserungsvorschläge in der Nutzungsweise von OOP freuen, falls euch irgendetwas auffällt, was definitiv besser geht. Ich entwickle erst seit ca. anderthalb Jahren in php und davon vllt die Hälfte mit OOP, also ist jeder Verbesserungsvorschlag erwünscht und ein Richtungsweiser für mich.

    zur Erklärung:
    Um das Script zu starten, muss es einfach in einer Datei abgelegt werden, die Zugangsdaten im Script angegeben werden und das Script aufgerufen werden.
    Das Script ist jetzt natürlich auf meine Bedürfnisse angepasst. Es baut die Klasse also so, wie ich sie benutze. Das bringt eine Besonderheit mit sich.
    Für die Angabe der Tabelle und der Zugangsdaten in der Query benutze ich Variablen der eigen erstellten Config-Klasse.
    Das Kürzel , was man in den Einstellungen angeben muss, ist der Variablennamen der Variable der Configklasse, in der der Name für die Tabelle steht.
    Auch die Zugangsdaten werden über entsprechende Variablen aus der Configklasse genommen.

    Wenn ihr mein Script ohne Abänderung benutzen wollt, dann müsst ihr diese configklasse in das script einfügen, in dem ihr die Vorlagen verwenden wollt. Ihr könnt natürlich auch mein Script zur Erstellung abändern oder den generierten Code jeweils für euch umbauen.
    Meine config Klasse sieht so aus:
    PHP-Code:
    class config
    {
        
    // ==== SQL-Einstellungen ====
            // SQL-Zugangsdaten
        
    public static $sql_host_PDO ='mysql:host=localhost;dbname=db_name';
        public static 
    $sql_user     ="root";
        public static 
    $sql_pw       ="passwort";
        
        public function 
    __construct()
        {
            
    // Namen für die SQL-Tabellen
            
            
    $this->sql_table_kuerzel         ="tabellen_name"";   // fuer kuerzel muss also name der variable hin bzw. die angabe im script unten
        }



    mit freundlichen Grüßen,
    poseidon29



    PHP-Code:
    <?php
    $db_name        
    "db_name";         // Datenbankname
    $host           "localhost";               // Host, im normalfall localhost
    $db_user        "root";                    // username
    $db_pw          "passwort";            // passwort
    $db_table       "tabellen_name";   // tabellenname, für den die vorlagen erstellt werden
    $db_table_kurz  "kuerzel";           // tabellenkuerzel , siehe post im Forum zur erklaerung

    $ac = new accesser($db_name$host$db_user$db_pw$db_table$db_table_kurz);

    $text $ac->access();


    echo
    "
    <pre align=left>
    "
    .$text."
    </pre>
    "
    ;


    class 
    accesser {
        public function 
    __construct($db_name$host$db_user$db_pw$db_table$db_table_kurz)
        {
            
    $host_pdo "mysql:host=".$host.";dbname=".$db_name;
            
    $this-> pdo = new PDO
                    
    (
                        
    $host_pdo,
                        
    $db_user,
                        
    $db_pw
                    
    );
            
            
    $this-> db_table  $db_table;
            
    $this->table_kurz $db_table_kurz;
            
    $this->pri        = array();
            
    $this->uni        = array();
            
            
            
    $query  "SHOW COLUMNS FROM `".$this-> db_table."`";
            
    $stmt   $this->pdo -> query ($query);
            
    $data   $stmt      -> fetchAll(PDO::FETCH_ASSOC);
            
            
            
            foreach(
    $data AS $key=>$row)
            {
                
    $data[$row['Field']]= $row;
                
                if(
    $row['Key']=="PRI")
                    
    array_push($this->pri$row);
                
                if(
    $row['Key']=="UNI")
                    
    array_push($this->uni$row);
                
                
                unset(
    $data[$key]);
            }
            
    $this->col_data $data;
            
            
            
            
            
    //echo"<pre align=left>";
            //print_r($data);
            //echo"</pre>";
            
        
    }
        
        
        
        public function 
    access()
        {
            
    $text  "";
            
    $text .= $this->class_open();
            
    $text .= $this->select_all();
            
    $text .= $this->select_by_param();
            
    $text .= $this->update();
            
    $text .= $this->insert();
            
    $text .= $this->delete();
            
    $text .= $this->truncate();
            
    $text .= $this->class_close();
            
            return 
    $text;
            
        }
        public function 
    select_all()
        {
            
    $text "
            
        public function select_all()
        {
            
            \$pdo= new PDO
                (
                    config::\$sql_host_PDO,
                    config::\$sql_user,
                    config::\$sql_pw
                );
            
            \$query  = 'SELECT * FROM `'.\$this->"
    .$this->table_kurz.".'` ';
            \$stmt   = \$pdo -> query (\$query);
            \$data   = \$stmt -> fetchAll(PDO::FETCH_ASSOC);
            return \$data;
            
        }
            "
    ;
            return 
    $text;
        }
        
        public function 
    select_by_param()
        {
            
    $text "
            
        public function select_by_param("
    ;
            
    $i=1;
            
    $max count($this->col_data);
            foreach(
    $this->col_data AS $key=>$col)
            {
                if(
    $i<$max)
                        
    $text.= "\$".$key.", " ;
                    elseif(
    $i $max)
                        
    $text.= "\$".$key." "  ;
                
                
                
    $i++;
            }
            
    $text.=")
        {
            \$pdo= new PDO
                (
                    config::\$sql_host_PDO,
                    config::\$sql_user,
                    config::\$sql_pw
                );
            
            \$query  = 'SELECT * FROM `'.\$this->"
    .$this->table_kurz.".'` WHERE ";
            
    $i=1;
            foreach(
    $this->col_data AS $key=>$col)
            {
                if(
    $i<$max)
                    
    $text.= "`".$key."`= ? AND " ;
                elseif(
    $i $max)
                    
    $text.= "`".$key."`= ? ';" ;
                
                
    $i++;
            }
            
            
            
    $text.="
            \$stmt   = \$pdo -> prepare (\$query);
            "
    ;
            
            
    $i=1;
            
    $max count($this->col_data);
            foreach(
    $this->col_data AS $key=>$col)
            {
                if(
    $col['Type']== 'int(11)' OR $col['Type']== 'tinyint')
                    
    $option "INT";
                else
                    
    $option "STR";
                
                
    $text.= "\$stmt   -> bindParam(".$i." , \$".$key."  , PDO::PARAM_".$option.");
            " 
    ;
                
                
    $i++;
            }
            
            
            
    $text.= "
            \$stmt   -> execute();
            \$data   = \$stmt -> fetchAll(PDO::FETCH_ASSOC);
            return \$data;
        }
            "
    ;
        
            
            return 
    $text;
        }
        
        public function 
    update()
        {
            
    // FUNCTION starten========
            
    $text "
            
        public function update("
    ;
            
    //PARAMETER ================
            
    $i=1;
            
    $max count($this->col_data);
            foreach(
    $this->col_data AS $key=>$col)
            {
                if(
    $i<$max)
                        
    $text.= "\$".$key.", " ;
                    elseif(
    $i $max)
                        
    $text.= "\$".$key.""  ;
                
                
    $i++;
            }
            if(!empty(
    $this->pri))
            {
                foreach(
    $this->pri AS $col)
                    
    $text.=", \$".$col['Field']."_primary ";
                
            }elseif(!empty(
    $this->uni))
            {
                
    $i=1;
                foreach(
    $this->uni AS $col)
                {
                    if(
    $i==1)
                        
    $text.=", ".$col['Field']."_unique";
                    else
                        
    $text.=", ".$col['Field']."_unique ";
                    
    $i++;
                }
            }
            
            
    // NEW PDO  und QUERY================
            
    $text.=")
        {
            \$pdo= new PDO
                (
                    config::\$sql_host_PDO,
                    config::\$sql_user,
                    config::\$sql_pw
                );
            
            \$query  = 'UPDATE `'.\$this->"
    .$this->table_kurz.".'`";
            
            
    // SET =========
            
    $text.="
                        SET     ("
    ;
            
    $i=1;
            foreach(
    $this->col_data AS $key=>$col)
            {
            
                if(
    $i<$max)
                        
    $text.= "`".$key."`, " ;
                    elseif(
    $i $max)
                        
    $text.= "`".$key."` )"  ;
                
                
    /*
                "UPDATE `".$this->sql_table_news."`
                            SET `name`=?,
                                `inhalt`=?,
                                `sicht`=?,
                                `erstellung`=?,
                                `verfall`=?,
                                `user_id`=?
                            WHERE `id`= ?";
                        */
                
    $i++;
            }
            
            
    //VALUES ==========
            
    $text.="
                        VALUES  ("
    ;
            
    $i=1;
            foreach(
    $this->col_data AS $key=>$col)
            {
            
                if(
    $i<$max)
                        
    $text.= "?, " ;
                    elseif(
    $i $max)
                        
    $text.= "? )"  ;
                
                
    $i++;
            }
            
            
    //WHERE =========
            
    $text.="
                        WHERE    "
    ;
            if(!empty(
    $this->pri))
            {
                foreach(
    $this->pri AS $col)
                    
    $text.="`".$col['Field']."` = ?";
                
            }elseif(!empty(
    $this->uni))
            {
                
    $i=1;
                foreach(
    $this->uni AS $col)
                {
                    if(
    $i==1)
                        
    $text.=    "`".$col['Field']."` = ?";
                    else
                        
    $text.="AND `".$col['Field']."` = ?";
                    
    $i++;
                }
            }
            
    // CLOSE query
            
    $text.="
            ';
            "
    ;
            
            
    // prepare=================
            
    $text.="
            \$stmt   = \$pdo -> prepare (\$query);
            
            "
    ;
            
            
    // BIND PARAM ==============
            
    $i=1;
            
    $max count($this->col_data);
            foreach(
    $this->col_data AS $key=>$col)
            {
                if(
    $col['Type']== 'int(11)' OR $col['Type']== 'tinyint')
                    
    $option "INT";
                else
                    
    $option "STR";
                
                
    $text.= "\$stmt   -> bindParam(".$i." , \$".$key."  , PDO::PARAM_".$option.");
            " 
    ;
                
                
    $i++;
            }
            
            if(!empty(
    $this->pri))
            {
                foreach(
    $this->pri AS $key=>$col)
                    if(
    $col['Type']== 'int(11)' OR $col['Type']== 'tinyint')
                        
    $option "INT";
                    else
                        
    $option "STR";
                    
                    
    $text.= "\$stmt   -> bindParam(".$i." , \$".$col['Field']."_primary  , PDO::PARAM_".$option.");";
                    
    $i++;
                
            }elseif(!empty(
    $this->uni))
            {
                foreach(
    $this->uni AS $key=>$col)
                {
                    if(
    $col['Type']== 'int(11)' OR $col['Type']== 'tinyint')
                        
    $option "INT";
                    else
                        
    $option "STR";
                    
                    
    $text.= "\$stmt   -> bindParam(".$i." , \$".$col['Field']."_unique  , PDO::PARAM_".$option.");";
                    
    $i++;
                }
            }
            
            
    // ENDING=================
            
    $text.= "
            
            \$stmt   -> execute();
            \$data   = \$stmt -> fetchAll(PDO::FETCH_ASSOC);
            return \$data;
        }
            "
    ;
        
            
            return 
    $text;
        }
        
        public function 
    insert()
        {
            
    $text "
            
        public function insert("
    ;
            
    $i=1;
            
    $max count($this->col_data);
            foreach(
    $this->col_data AS $key=>$col)
            {
                if(
    $col['Extra']!='auto_increment')
                {
                    if(
    $i<$max)
                        
    $text.= "$".$key.", " ;
                    elseif(
    $i $max)
                        
    $text.= "$".$key." )"  ;
                }
                
    $i++;
            }
            
            
            
    $text.="
        {
            \$pdo= new PDO
                (
                    config::\$sql_host_PDO,
                    config::\$sql_user,
                    config::\$sql_pw
                );
            
            \$query  = 'INSERT INTO `'.\$this->"
    .$this->table_kurz.".'` ";
            
    // SET =========
            
    $text.="
                            ("
    ;
            
    $i=1;
            foreach(
    $this->col_data AS $key=>$col)
            {
                if(
    $col['Extra']=='auto_increment')
                {
                    if(
    $i<$max)
                        
    $text.= "`".$key."`, " ;
                    elseif(
    $i $max)
                        
    $text.= "`".$key."` )"  ;
                }else{
                    if(
    $i<$max)
                        
    $text.= "`".$key."`, " ;
                    elseif(
    $i $max)
                        
    $text.= "`".$key."` )"  ;
                }
                
                
                
    $i++;
            }
            
            
    // VALUES ==========
            
    $text.="
                        VALUES
                            ("
    ;
            
    $i=1;
            foreach(
    $this->col_data AS $key=>$col)
            {
            
                if(
    $col['Extra']=='auto_increment')
                {
                    if(
    $i<$max)
                        
    $text.= "NULL, " ;
                    elseif(
    $i $max)
                        
    $text.= "NULL )"  ;
                }else{
                    if(
    $i<$max)
                        
    $text.= "?, " ;
                    elseif(
    $i $max)
                        
    $text.= "? )';"  ;
                }
                
    $i++;
            }
            
            
            
            
    $text.="
            \$stmt   = \$pdo -> prepare (\$query);
            "
    ;
            
    $i=1;
            foreach(
    $this->col_data AS $key=>$col)
            {
                if(
    $col['Extra']!='auto_increment')
                {
                    if(
    $col['Type']== 'int(11)' OR $col['Type']== 'tinyint')
                        
    $option "INT";
                    else
                        
    $option "STR";
                    
                    
    $text.= "\$stmt   -> bindParam(".$i." , \$".$key."  , PDO::PARAM_".$option.");
            " 
    ;
                    
    $i++;
                }
            }
            
            
            
    $text.="
            \$stmt -> execute ();
            
        }
            "
    ;
            return 
    $text;
        }
        
        public function 
    delete()
        {
            
    $text "
            
        public function delete("
    ;
        
            
    $i=1;
            
    $max count($this->col_data);
            if(!empty(
    $this->pri))
            {
                foreach(
    $this->pri AS $col)
                {
                    if(
    $i==1)
                        
    $text.="$".$col['Field']."_primary";
                    else
                        
    $text.=", $".$col['Field']."_primary";
                    
    $i++;
                }
                
            }elseif(!empty(
    $this->uni))
            {
                
    $i=1;
                foreach(
    $this->uni AS $col)
                {
                    if(
    $i==1)
                        
    $text.="$".$col['Field']."_unique";
                    else
                        
    $text.=", $".$col['Field']."_unique ";
                    
    $i++;
                }
            }
            
    $text.=")
        {
            
                
            \$pdo= new PDO
                (
                    config::\$sql_host_PDO,
                    config::\$sql_user,
                    config::\$sql_pw
                );
            
            \$query  = 'DELETE FROM  `'.\$this->"
    .$this->table_kurz.".'` WHERE ";
            
    // WHERE ====================
            
    $i=1;
            if(!empty(
    $this->pri))
            {
                foreach(
    $this->pri AS $key=>$col)
                {
                    if(
    $i=1)
                        
    $text.= "`".$col['Field']."`= ?";
                    else
                        
    $text.= "AND `".$col['Field']."`= ?";
                    
    $i++;
                }
                
            }elseif(!empty(
    $this->uni))
            {
                foreach(
    $this->uni AS $key=>$col)
                {
                    if(
    $i=1)
                        
    $text.= "`".$col['Field']."`= ?";
                    else
                        
    $text.= "AND `".$col['Field']."`= ?";
                    
    $i++;
                }
            }
            
            
    $text.="';
            
            \$stmt   = \$pdo -> prepare (\$query);
            "
    ;
            
    // BIND PARAM ================================
            
    $i=1;
            if(!empty(
    $this->pri))
            {
                foreach(
    $this->pri AS $key=>$col)
                {
                    if(
    $col['Type']== 'int(11)' OR $col['Type']== 'tinyint')
                        
    $option "INT";
                    else
                        
    $option "STR";
                    
                    
    $text.= "\$stmt   -> bindParam(".$i." , \$".$col['Field']."_primary  , PDO::PARAM_".$option.");";
                    
    $i++;
                }
                
            }elseif(!empty(
    $this->uni))
            {
                foreach(
    $this->uni AS $key=>$col)
                {
                    if(
    $col['Type']== 'int(11)' OR $col['Type']== 'tinyint')
                        
    $option "INT";
                    else
                        
    $option "STR";
                    
                    
    $text.= "\$stmt   -> bindParam(".$i." , \$".$col['Field']."_unique  , PDO::PARAM_".$option.");";
                    
    $i++;
                }
            }
            
    $text.="
            \$stmt   -> execute();
            
        }
            "
    ;
            return 
    $text;
        }
        
        
        public function 
    truncate()
        {
            
    $text "
            
        public function truncate()
        {
            
            \$pdo= new PDO
                (
                    config::\$sql_host_PDO,
                    config::\$sql_user,
                    config::\$sql_pw
                );
            
            \$query  = 'TRUNCATE `'.\$this->"
    .$this->table_kurz.".'` ';
            \$stmt   = \$pdo -> query (\$query);
            
        }
            "
    ;
            return 
    $text;
        }
        
        private function 
    class_open()
        {
            
    $text =
            
    "
    class new_class extends config
    {
            "
    ;
            return 
    $text;
        }
        
        private function 
    class_close()
        {
            
    $text =
            
    "
    }
            "
    ;
            return 
    $text;
        }
        
        
    }
    ?>

  • #2
    truncrate?

    Ich schaue mir das gerade via tapatalk an. Dabei geht doch einiges verloren. Was unterscheidet deine Lösung von meiner?

    Und äh... PHP 5.1? Wo bitte findet man das denn noch? Läuft 5.4 nicht gerade auf EOL zu?

    Kommentar


    • #3
      Zitat von rkr Beitrag anzeigen
      ... Läuft 5.4 nicht gerade auf EOL zu?

      Jop, nur mehr "security-support" bis 09/2015 http://php.net/supported-versions.php
      The string "()()" is not palindrom but the String "())(" is.

      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Ich hätte sonst auch noch eine Lösung :

        https://github.com/chrisandchris/symfony-rowmapper
        [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

        Kommentar


        • #5
          Zitat von ChristianK Beitrag anzeigen
          Ich hätte sonst auch noch eine Lösung :

          https://github.com/chrisandchris/symfony-rowmapper

          Deine ist ja vielleicht sogar besser - aber wie funktioniert sie?

          Kommentar


          • #6
            Joa, das mit dem Doku schreiben habe ich noch nicht so im Griff ^^

            Ein kleiner Einstiegspunkt: https://github.com/chrisandchris/sym...erTest.php#L19

            Wenn du Interesse hast, die Klasse auch einmal zu verwenden würde ich sogar noch eine Doku schreiben .
            [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

            Kommentar


            • #7
              Es gibt hunderte QueryBuilder auf dem Markt und totgetestete ORMs die neben SQL auch DQL und QueryBuilder mitbringen. Wozu die mühe einen rowmapper oder einen class generator zu bauen ?
              [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

              Kommentar


              • #8
                Weil keiner meinen Wünschen und Anforderungen entsprach Und weil ich es kann.
                [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                Kommentar


                • #9
                  Zitat von ChristianK Beitrag anzeigen
                  Joa, das mit dem Doku schreiben habe ich noch nicht so im Griff ^^

                  Ein kleiner Einstiegspunkt: https://github.com/chrisandchris/sym...erTest.php#L19

                  Wenn du Interesse hast, die Klasse auch einmal zu verwenden würde ich sogar noch eine Doku schreiben .
                  Die API sieht echt gut aus. Da ich bei mir quasi nur mit query-builder arbeite, weiss ich das durchaus zu würdigen. Die "Geschwätzigkeit" der API finde ich allerdings etwas heftig. Wenn ich das richtig verstehe, dann tun die beiden quasi das Gleiche:

                  PHP-Code:
                  $Builder->select()
                  ->
                  fieldlist([
                      
                  'field1' => 'aliasName',
                      
                  'field2'
                  ])
                  ->
                  table('foobar')
                  ->
                  join('nexttable')
                      ->
                  using('usingField')
                  ->
                  join('newtable''left')
                      ->
                  on()
                          ->
                  field(['lefttable''leftfield'])
                          ->
                  equals()->value('1')
                      ->
                  close()
                  ->
                  where()
                      ->
                  brace()
                          ->
                  select()
                          ->
                  fieldlist([
                              
                  'subfield1'
                          
                  ])
                          ->
                  table('subtable')
                          ->
                  limit(1)
                      ->
                  close()
                      ->
                  equals()->value(13)
                      ->
                  connect('&')->field('field1')
                      ->
                  equals()->value('value1')
                      ->
                  connect('&')
                      ->
                  brace()
                          ->
                  field('field2')
                          ->
                  equals()->value(-1)
                          ->
                  connect('|')->field('field2')
                          ->
                  equals()->field('field3')
                      ->
                  close()
                  ->
                  close()
                  ->
                  orderBy([
                      
                  'field1',
                      
                  'field2'
                  ])
                  ->
                  limit(10
                  PHP-Code:
                  $db->getAliasRegistry()->add('testdb''mydb.test__');

                  echo (string) 
                  $db->select()
                  ->
                  field('a.field1''aliasName')
                  ->
                  field('a.field2')
                  ->
                  from('a''testdb#foobar')
                  ->
                  joinInner('b''testdb#nexttable''b.usingField = a.differentField')
                  ->
                  joinInner('c''testdb#newtable''c.leftfield = ?'1)
                  ->
                  where('13 = ?',
                      
                  $db->select()
                      ->
                  field('s.subfield1')
                      ->
                  from('s''testdb#subtable')
                      ->
                  limit(1)
                  )
                  ->
                  where('a.field1 = :value')
                  ->
                  where('a.field2 = ? OR a.field2 = a.field3', -1)
                  ->
                  bindValue('value''value1')
                  ->
                  limit(10); 
                  Output:
                  PHP-Code:
                  SELECT
                      a
                  .field1 AS `aliasName`,
                      
                  a.field2
                  FROM
                      mydb
                  .test__foobar a
                  INNER JOIN
                      mydb
                  .test__nexttable b ON b.usingField a.differentField
                  INNER JOIN
                      mydb
                  .test__newtable c ON c.leftfield '1'
                  WHERE
                      
                  (13 = (    SELECT
                                  s
                  .subfield1
                              FROM
                                  mydb
                  .test__subtable s
                              LIMIT
                                  1
                          
                  ))
                      AND
                      (
                  a.field1 = :value)
                      AND
                      (
                  a.field2 '-1' OR a.field2 a.field3)
                  LIMIT
                      10 
                  Ich habe ganz oben auf meiner TODO stehen, die Expression-Parameter zu parsen und so die bei dir benötigten Methoden zu ersetzen. Aktuell zieht Scala aber sehr an meiner Zeit.

                  Kommentar


                  • #10
                    Ja, deine ist durchaus etwas knapper formuliert. Die Idee meiner war, so nah wie möglich an echtem SQL zu sein, deshalb ist das Vorgehen etwas umfangreicher als bei dir. Persönlich finde ich die Vorgehensweise mit bindValue() nicht ganz optimal, ich habe aus dem Grund die Parameter direkt in den entsprechenden Ort im Query-Builder genommen, damit der Code lesbarer wird [value($somevalue)].

                    Das Verhalten deines Builders bei Sub-Queries und where-conditions scheint auf jeden Fall etwas schlanker zu sein. Da könnte ich auf jeden Fall optimieren. Mein Fokus lag im ersten Schritt vor allem auf das einfache Auflisten von Feldern [fieldlist()], weil diese direkt auf Entities gemappt werden.

                    Als ich begonnen habe, fand ich keinen sauberen Algorithmus um zu erkennen, wann ein Komma automatisch gesetzt werden kann/soll und wann Klammern automatisch geöffnet/geschlossen werden können. Da hast du auf jeden Fall einen Vorteil gegenüber mir.
                    [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                    Kommentar


                    • #11
                      Bei mir ist bindParam auch nur die zweite Option. Die direkte Zuweisung ist ebenfalls möglich. Allerdings nicht bei allen Methoden (groupBy, orderBy, limit, offset). Da braucht man dann Named-Params. Mit deiner Variante hat der Builder weniger Probleme, Feldnamen als solche zu verstehen und datenbank-spezifisch zu quoten. Ich benutze diesen Flavor auch schon seit Jahren und habe nur äußerst selten einen Fall gehabt, wo ich mit meinem QB nicht mehr weiter kam. Allerdings habe ich Probleme mit reservierten Schlüsselwörtern und das muss ich noch angehen. Ich hätte so gerne einige Elemente aus Scala in PHP, dann ware das alles ein Nobrainer

                      PHP-Code:
                      val value 123
                      val query 
                      conn.prepare select 'field1 from 'myTable where ('myfield = value) orderBy ('field1 'field2 % 'field3)

                      query exec fetchRows map row => print(row.column 'field1 asString) } 
                      http://www.scala-lang.org/old/node/1403

                      Kommentar


                      • #12
                        Ah ok, so tief habe ich nicht reingesehen. Das ist also doch sehr gut. Ich komme mit meinem ziemlich oft nicht zum Ziel, da ich je nach Software stark verschachtelte Queries mit Sub-Queries und Gruppierungen etc, da bin ich RAW schneller.

                        Mal sehen, ich habe noch einiges zu tun, vielleicht verschlanke ich auf 2.1 um einiges. In der 2.0 ist mehr der Fokus auf Tests, Funktionserweiterung ung Exception-Handling. Da ist auch noch vieles offen...
                        [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                        Kommentar


                        • #13
                          Hättest du ein Beispiel für so eine komplexe Abfrage?

                          Kommentar


                          • #14
                            Möglicherweise wäre es auch klever den Haupt-Fokus des Repositories auf den Query-Builder zu legen und ein weiteres Repository anzulegen das den Query-Builder als Dependency hat und dann das Bundle bereitstellt. Quasi ein Query-Builder mit Symfony-Support ohne Symfony direkt in Abhängigkeit dazu zu setzen.
                            [URL="https://gitter.im/php-de/chat?utm_source=share-link&utm_medium=link&utm_campaign=share-link"]PHP.de Gitter.im Chat[/URL] - [URL="https://raindrop.io/user/32178"]Meine öffentlichen Bookmarks[/URL] ← Ich habe dir geholfen ? [B][URL="https://www.amazon.de/gp/wishlist/348FHGUZWTNL0"]Beschenk mich[/URL][/B].

                            Kommentar


                            • #15
                              Zitat von rkr Beitrag anzeigen
                              Hättest du ein Beispiel für so eine komplexe Abfrage?
                              Ja, ein Beispiel wäre das hier: https://gist.github.com/chrisandchri...e78e8b68975185


                              Zitat von tr0y Beitrag anzeigen
                              Möglicherweise wäre es auch klever den Haupt-Fokus des Repositories auf den Query-Builder zu legen und ein weiteres Repository anzulegen das den Query-Builder als Dependency hat und dann das Bundle bereitstellt. Quasi ein Query-Builder mit Symfony-Support ohne Symfony direkt in Abhängigkeit dazu zu setzen.
                              Das wäre auch eine Möglichkeit. Ich werde mir das einmal notieren und merken, und bei genügend Zeit vielleicht auch implementieren.
                              [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                              Kommentar

                              Lädt...
                              X