La gestione del database su Symfony è di tipo ORM (Object-relational mapping), cioè òegge e scrive dal database utilizzando un’interfaccia orientata agli oggetti.
Symfony dispone di due ORM Propel e Doctrine.
L’ORM ha bisogno della descrizione delle tabelle e delle loro relazioni per creare le relative classi, quindi descriviamo il tutto in un file YAML.
1. C:\wamp64\www\jobeet\config\doctrine\schema.yml
Qui descriviamo in formato YML le tabelle e le colonne del DB
NB: in YAML l’indentazione deve essere fatta con uno o più spazi, mai con le tabulazioni.
# config/doctrine/schema.yml
JobeetCategory:
actAs: { Timestampable: ~ }
columns:
name: { type: string(255), notnull: true, unique: true }
JobeetJob:
actAs: { Timestampable: ~ }
columns:
category_id: { type: integer, notnull: true }
type: { type: string(255) }
company: { type: string(255), notnull: true }
logo: { type: string(255) }
url: { type: string(255) }
position: { type: string(255), notnull: true }
location: { type: string(255), notnull: true }
description: { type: string(4000), notnull: true }
how_to_apply: { type: string(4000), notnull: true }
token: { type: string(255), notnull: true, unique: true }
is_public: { type: boolean, notnull: true, default: 1 }
is_activated: { type: boolean, notnull: true, default: 0 }
email: { type: string(255), notnull: true }
expires_at: { type: timestamp, notnull: true }
relations:
JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id, foreignAlias: JobeetJobs }
JobeetAffiliate:
actAs: { Timestampable: ~ }
columns:
url: { type: string(255), notnull: true }
email: { type: string(255), notnull: true, unique: true }
token: { type: string(255), notnull: true }
is_active: { type: boolean, notnull: true, default: 0 }
relations:
JobeetCategories:
class: JobeetCategory
refClass: JobeetCategoryAffiliate
local: affiliate_id
foreign: category_id
foreignAlias: JobeetAffiliates
JobeetCategoryAffiliate:
columns:
category_id: { type: integer, primary: true }
affiliate_id: { type: integer, primary: true }
relations:
JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id }
JobeetAffiliate: { onDelete: CASCADE, local: affiliate_id, foreign: id }
L’attributo onDelete definisce il comportamento ON DELETE delle chiavi esterne, Doctrine supporta CASCADE, SET NULL e RESTRICT. Per esempio quando un record job viene eliminato, tutti i record jobeet_category_affiliate associati verranno automaticamente eliminati dal database.
2. Aprire PhpMyAdmin> Nuovo> Crea un nuovo database> jobeet
3. Indichiamo a Symfony di utilizzare il database jobeet, supponendo che il nostro DB non abbia bisogno di password:
cmd.exe -> C:\wamp64\www\jobeet>symfony configure:database “mysql:host=localhost;dbname=jobeet”
Il task configure:database salva la configurazione all’interno del file jobeet/config/databases.yml:
all:
doctrine:
class: sfDoctrineDatabase
param:
dsn: 'mysql:host=localhost;dbname=jobeet'
username: root
password: null
4. Crezione dei modelli cioè delle classi PHP per la gestione del DB:
cmd.exe -> C:\wamp64\www\jobeet>symfony doctrine:build –model
Crea i file php con le classi per la gestione del DB in jobeet/lib/model/doctrine/
– JobeetAffiliate.class.php
– JobeetAffiliateTable.class.php
– etc…
Il DB è ancora vuoto, non ha tabelle ne colonne
5. Generazione dei comandi SQL
cmd.exe -> C:\wamp64\www\jobeet>symfony doctrine:build –sql
Genera il file jobeet/data/sql/schema.sql:
CREATE TABLE jobeet_affiliate (id BIGINT AUTO_INCREMENT, url VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL UNIQUE, token VARCHAR(255) NOT NULL, is_active TINYINT(1) DEFAULT '0' NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY(id)) ENGINE = INNODB;
CREATE TABLE jobeet_category (id BIGINT AUTO_INCREMENT, name VARCHAR(255) NOT NULL UNIQUE, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY(id)) ENGINE = INNODB;
CREATE TABLE jobeet_category_affiliate (category_id BIGINT, affiliate_id BIGINT, PRIMARY KEY(category_id, affiliate_id)) ENGINE = INNODB;
CREATE TABLE jobeet_job (id BIGINT AUTO_INCREMENT, category_id BIGINT NOT NULL, type VARCHAR(255), company VARCHAR(255) NOT NULL, logo VARCHAR(255), url VARCHAR(255), position VARCHAR(255) NOT NULL, location VARCHAR(255) NOT NULL, description TEXT NOT NULL, how_to_apply TEXT NOT NULL, token VARCHAR(255) NOT NULL UNIQUE, is_public TINYINT(1) DEFAULT '1' NOT NULL, is_activated TINYINT(1) DEFAULT '0' NOT NULL, email VARCHAR(255) NOT NULL, expires_at DATETIME NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX category_id_idx (category_id), PRIMARY KEY(id)) ENGINE = INNODB;
ALTER TABLE jobeet_category_affiliate ADD CONSTRAINT jobeet_category_affiliate_category_id_jobeet_category_id FOREIGN KEY (category_id) REFERENCES jobeet_category(id) ON DELETE CASCADE;
ALTER TABLE jobeet_category_affiliate ADD CONSTRAINT jobeet_category_affiliate_affiliate_id_jobeet_affiliate_id FOREIGN KEY (affiliate_id) REFERENCES jobeet_affiliate(id) ON DELETE CASCADE;
ALTER TABLE jobeet_job ADD CONSTRAINT jobeet_job_category_id_jobeet_category_id FOREIGN KEY (category_id) REFERENCES jobeet_category(id) ON DELETE CASCADE;
Il DB è ancora vuoto, non ha tabelle ne colonne
6. Eseguiamo schema.sql nel DB
cmd.exe -> C:\wamp64\www\jobeet>symfony doctrine:insert-sql
Aprire PhpMyAdmin, ora il database ha tabelle e colonne
7. Ripuliamo la cache per permettere a Symfony di utilizzare le nuove classi creare con la creazione dei modelli
cmd.exe -> C:\wamp64\www\jobeet>symfony cache:clear
Reference:
http://symfony.com/legacy/doc/jobeet/1_4/it/03?orm=Doctrine