Il Model è la parte dell’applicazione che si occupa di gestire i dati; nella maggior parte dei casi si tratta di dati che vengono salvati su database. Il controller farà uso dei metodi disponibili nella classe model per ricevere i dati di cui ha bisogno.
Nella nostra applicazione di gestione di magazzino, possiamo immaginare di avere una tabella che cataloghi tutto il contenuto del magazzino. La tabella, molto semplicemente potrebbe essere:
CREATE TABLE `oggetti` (
`id` int(11) NOT NULL auto_increment,
`nome` varchar(50) collate utf8_unicode_ci NOT NULL,
`scaffale` int(11) NOT NULL,
`quantita` int(11) NOT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Il modello corrispondente, quindi, potrebbe essere:
class Oggetti extends Model {
var $nome;
var $scaffale;
var $quantita;
function Oggetti () {
parent::Model();
}
function mostra_tutti () {
// estrae tutti gli elementi dal database
}
function mostra_scaffale ($id_scaffale) {
// estrae gli elementi filtrandoli per scaffale
}
// più i soliti metodi crea, modifica, cancella,...
function crea ($nome, $scaffale, $quantita) { }
function modifica ($id, $nome, $scaffale, $quantita) { }
function cancella ($id) { }
}
Quindi in buona sostanza una classe che implementi i classici metodi CRUD più altri metodi d’utilità.
Per interrogare il DB, CodeIgniter fornisce una versione del pattern Active Record che semplifica la creazione di query e ci permette di scrivere codice indipendente dal tipo di database usato (attualmente i driver disponibili sono mssql, mysql, mysqli, oci8, odbc, postgres e sqlite).
La classe ActiveRecord fornisce metodi per la selezione, la modifica, l’inserimento e la cancellazione di dati. Inoltre sono supportate le funzioni più comuni (sum, avg…), le join, le transazioni e molto altro.
A questo punto possiamo entrare più nel dettaglio delle nostre funzioni e fare qualche esempio pratico:
function mostra_tutti () {
$out = array();
$this->db->select('nome, scaffale, quantita');
$this->db->order_by('nome');
$query = $this->db->get('oggetti');
foreach ($query->result() as $row) {
$out[] = $row;
}
return $out;
}
Per semplificare la sintassi è anche possibile utilizzare il chaining dei metodi:
$query = $this->db->select('nome, scaffale, quantita')
->order_by('nome')
->get('oggetti');
Per quanto riguarda la modifica e l’inserimento invece basta passare ai metodi insert() e update() un oggetto o un array di valori. In questo caso passeremo l’oggetto $this, ma potremmo anche creare un array od un oggetto ad hoc.
function crea ($nome, $scaffale, $quantita) {
$this->nome = $nome;
$this->scaffale = $scaffale;
$this->quantita = $quantita;
$this->db->insert('oggetti', $this);
}
function modifica ($id, $nome, $scaffale, $quantita) {
$this->nome = $nome;
$this->scaffale = $scaffale;
$this->quantita = $quantita;
$this->db->where('id', $id);
$this->db->update('oggetti', $this);
}
Molto semplicemente la cancellazione sarà:
function cancella ($id) {
$this->db->where('id', $id);
$this->db->delete('oggetti');
}
Rimando come al solito alla guida per un ulteriore approfondimento della classe Database e dell’ActiveRecord. Inoltre consiglio di dare anche un’occhiata al meccanismo di Caching di CodeIgniter che può alleggerire di molto il carico sul database.
A questo punto siamo pronti per il lato di presentazione della nostra applicazione: la view, che affronterò nella prossima lezione.