Il Model è lo strato dell'architettura MVC che si occupa della rappresentazione dei dati e che contiene la logica di business dell'applicazione. Il model di Symfony si basa su un metodo di mappatura chiamato Propel adatto per applicazioni sviluppate con linguaggi di programmazione orientati agli oggetti (come il PHP) e database relazionali (ORM Object-Relational Mapping). Symfony consente di effettuare tutte le operazioni sul database attraverso delle classi che astraggono la sua struttura evitando in questo modo la necessità di dover operare direttamente su di esso.
L'uso di questa architettura garantisce una serie di privilegi:
- portabilità: una volta definite le classi di dati è possibile cambiare il database senza dover modificare quasi nulla nel codice scritto se non i file di configurazione che indicano il tipo di base dati utilizzato.
- riusabilità: i metodi scritti per una determinata classe di dati possono essere richiamati in diversi punti dell'applicazione e anche tra applicazioni differenti
- possibilità di definire "campi" non presenti sulle tabelle: è possibile aggiungere proprietà alle classi di dati che non trovano corrispondenza con i campi delle tabelle del database. Ad esempio per un'applicazione di e-commerce può essere comodo definire una proprietà PrezzoTotale = PrezzoUnitario * Quantita in una classe che astrae la tabella Ordini nella quale sono presenti solo i campi PrezzoUnitario e Quantita.
Riguardo alla portabilità vale soffermarsi un attimo in quanto rappresenta forse il punto di maggior forza del'ORM. Quando scriviamo le query utilizzate da un applicativo per effettuare le operazione sul database possiamo correre nel rischio di utilizzare sintassi e comandi SQL tipici di quel database che possono essere anche molto comodi ma che comportano problemi quando vogliamo cambiare DB. Dovremmo infatti riscrivere tutte le query. È buona norma invece scrivere le query utilizzando una sintassi indipendente dal database e affidare la traduzione in SQL a un componente esterno dipendente dal tipo di database utilizzato.
Ad esempio potremmo utilizzare delle stored procedure per scrivere le query nel linguaggio specifico del database (PL/SQL per Oracle, T-SQL per Microsoft SQLServer, ...) e utilizzare una sintassi "a più alto livello" nel model per richiamare queste procedure proprie del DB.