Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 26
parentRepo
0.00% covered (danger)
0.00%
0 / 1
50.00% covered (danger)
50.00%
1 / 2
210
0.00% covered (danger)
0.00%
0 / 26
 table_name
100.00% covered (success)
100.00%
1 / 1
1  
 
 __callStatic
0.00% covered (danger)
0.00%
0 / 1
182
0.00% covered (danger)
0.00%
0 / 26
<?php
    namespace manager\repo;
    use \manager\Database;
    class parentRepo{
        // mise à jour du nom de la table (pour les enfants)
        protected static function table_name(){ static $table_name = null; return $table_name;  }
        /* GESTION DES GETTERS dynamiques
        *
        * @method<String>                                     Nom du getter du type 'getAll' ou 'getX' avec 'X' une colonne de la table en question
        * @args<Array>                                         Liste des arguments, $args[0] est la valeur du getter (sauf pour 'getAll')
        *
        * @return lines<Array>                                 Retourne le résultat du fetchAll()
        *
        */
        public static function __callStatic($method, $args){
            // Si static::table_name() NULL
            if( is_null(static::table_name()) ) return false;
            /* [1] On vérifie que la méthode est 'getX', avec X une chaine
            =========================================================*/
            // Si c'est pas le bon format, on retourne une erreur
            if( !preg_match('/^get(?:By(\w+)|(All))$/', $method, $matches) ) return false;
            /* [2] On charge la liste des colonnes de la table
            =========================================================*/
            $getColumns = Database::getPDO()->query('SHOW COLUMNS FROM '.static::table_name());
            $cols = Database::delNumeric( $getColumns->fetchAll() );
            $table_columns = array(
                '_PRIMARY_' => array() // Contiendra les champs de la clé primaire
            );
            // On ajoute la liste des colonnes
            foreach($cols as $column){
                // On enregistre la clé primaire (si elle l'est)
                if( $column['Key'] == 'PRI' ) array_push($table_columns['_PRIMARY_'], $column['Field']);
                array_push($table_columns, $column['Field']);
            }
            /* [3] On vérifie que la valeur après 'get' est dans $table_columns
            =========================================================*/
            $columnName = strtolower($matches[1]);
            $getAll       = count($matches) > 2; // Si 'getAll'
            $getById      = $columnName == 'id';
            $getSomething = count($args) > 0 && in_array($columnName, $table_columns); // Si 'getX', et 'X' dans la liste des colonnes
            // Si ni 'getAll' ni 'getSomething' -> erreur
            if( !$getById && !$getAll && !$getSomething ) return false;
            /* [4] On rédige la requête
            =========================================================*/
            $getRequestString = 'SELECT * FROM '.static::table_name();
            // Si c'est 'getById', on ajoute une condition (clé primaire)
            if( $getById ){
                $getRequestString .= ' WHERE '.$table_columns['_PRIMARY_'][0].' = :value';
                // TODO: Gestion d'une clé primaire composée (plusieurs arguments)
            // Si c'est 'getSomething', on ajoute une condition
            }else if( $getSomething )
                $getRequestString .= ' WHERE '.$columnName.' = :value';
            $getRequestString .= ' ORDER BY 1 ASC';
            // On prépare la requête
            $getRequest = Database::getPDO()->prepare($getRequestString);
            /* [5] On exécute la requête
            =========================================================*/
            // Si 'getSomething', on ajoute le champ
            $getRequest->execute(array(
                ':value' => ($getSomething||$getById) ? $args[0] : null
            ));
            /* [6] On récupère le résultat
            =========================================================*/
            return Database::delNumeric( $getRequest->fetchAll() );
        }
    }
?>