lunedì 10 ottobre 2011

Drupal - Un semplice Select

Mi risulta davvero fastidioso perdere tempo per fare cose che normalmente richiederebbero tre minuti ma tanté che Drupal devo impararmelo e così me lo tengo.

Magari uno si trova a dover fare una query su una tabella, magari quella inserita nel post precedente.
Non vi spiegherò quanto è contorto Drupal. Mi limiterò a farvi vedere un esempio.

Premessa: In Drupal 7 le query al DB vengono fatte tramite funzioni apposite che si chiamano come la tipologia di query da fare. Avremo quindi:

db_select;
db_insert;
db_update;
db_delete;

Mettiamo che abbiamo una tabella chiamata png_creator_races e vogliamo fare l'equivalente di:

SELECT * FROM png_creator_races as n ORDER BY id_race ASC

Useremo la seguente sintassi:

<?php
public function loadAllRaces(){
        $result = db_select('png_creator_races', 'n')->fields('n')->orderBy('id_race', 'ASC')->execute();
        while ($field = $result->fetchAssoc()){
            $race = new race();
            $race->race_name = $field['race_name'];
            $race->mod_for = $field['mod_for'];
            $race->mod_dex = $field['mod_dex'];
            $race->mod_cos = $field['mod_cos'];
            $race->mod_int = $field['mod_int'];
            $race->mod_wis = $field['mod_wis'];
            $race->mod_car = $field['mod_car'];
            $race->mod_cus = $field['mod_cus'];
            $this->races[] = $race;
        }        
    }
?>

Nell'esempio sopra ho un metodo loadAllRaces dentro una classe (che ho omesso) che si occupa di fare la nostra select.

Tutto ruota sull'oggetto ritornato da db_select i cui due parametri sono "nome tabella" ed "alias tabella".
Tutti gli altri pezzi possono essere aggiunti in coda o anche sotto secondo la forma:


<?php
$query = db_select('png_creator_races', 'n');
        $query->fields('n');
        $query->orderBy('id_race','ASC');
        $result = $query->execute();
?>

Da notare che mentre prima avevo la variabile result direttamente uguale a tutto il blocco, adesso ho creato un oggetto $query su cui ho lanciato i vari metodi.
Questi metodi permettono di fare altre cose tra cui JOIN, condizioni WHERE, le ovvie LIMIT ed addirittura la paginazione. Per questo ed altro rivediamo altri esempi in futuro.

Tornando al pezzo di codice sopra, vediamo come il nostro While usi il comando fetchAssoc che restituisce la nextRow per associazione. La parte sotto è solo una mappatura della riga della tabella su un oggetto di tipo race.

Nessun commento:

Posta un commento