|
Mise à jour : 14/05/2010
Difficulté :
Intermédiaire
411 visites depuis 7 jours
, classé 262/777
|

1 2 3 4 5 6 7 8 9 10 11 | <?php $maNews = new News(); // On définit les caractéristiques de la news. $maNews->titre = 'La première news du site'; $maNews->auteur = 'christophetd'; $maNews->contenu = 'Bienvenue sur mon site, j\'espère qu\'il vous plaira !'; // Puis, on sauvegarde le tout dans la base de données. $maNews->save(); ?> |


1 2 3 4 5 | <?php // Nous allons travailler sur un module de news, donc la classe s'appellera News. class News extends Doctrine_Record { } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?php class News extends Doctrine_Record { public function setTableDefinition() { // On définit le nom de notre table : « news ». $this->setTableName('news'); //Puis, tous les champs $this->hasColumn('id', 'integer', 8, array('primary' => true, 'autoincrement' => true)); $this->hasColumn('titre', 'string', 100); $this->hasColumn('auteur', 'string', 100); $this->hasColumn('contenu', 'string', 4000); } } ?> |


1 2 3 4 5 6 7 8 9 | <?php // On inclut le modèle «News ». require_once dirname(__FILE__).'/modeles/News.class.php'; class NewsTable extends Doctrine_Table { } ?> |
1 2 3 4 | <?php require_once 'lib/Doctrine.php'; spl_autoload_register(array('Doctrine_Core', 'autoload')); require_once 'modeles/News.class.php'; |
1 2 3 4 | <?php // Si l'utilisateur ne possède pas de mot de passe, il faut faire directement « utilisateur@serveur ». $dsn = 'mysql://root@localhost/developpement'; $connexion = Doctrine_Manager::connection($dsn); |
1 2 3 4 5 6 7 8 9 | <?php try { $table = Doctrine_Core::getTable('News'); // On récupère l'objet de la table. $connexion->export->createTable($table->getTableName(), $table->getColumns()); // Puis, on la crée. echo 'La table a bien été créée'; } catch(Doctrine_Connection_Exception $e) { // Si une exception est lancée. echo $e->getMessage(); // On l'affiche. } |


1 2 3 4 5 6 7 8 | <?php require_once 'lib/Doctrine.php'; spl_autoload_register(array('Doctrine', 'autoload')); require_once 'modeles/News.class.php'; // Adaptez cela selon vos besoins bien entendu. $dsn = 'mysql://root@localhost/developpement'; $connexion = Doctrine_Manager::connection($dsn); |
1 2 | <?php $news = new News(); |

1 2 3 4 | <?php $news->titre = 'Doctrine'; $news->auteur = 'Georges Clooney'; $news->contenu = 'Doctrine, what else ?'; |

1 2 | <?php $news->save(); |
), vous voyez s'insérer comme par magie dans votre table une ligne correspondant aux valeurs que vous avez indiquées.1 2 3 | INSERT INTO `news` (`id`, `titre`, `auteur`, `contenu`) VALUES (NULL, 'La premiere news du site', 'christophetd', 'Bonjour, Bienvenue sur mon site, j''espere que vous l''aimerez ... @+'), (NULL, 'Fermeture temporaire du site', 'vyk12', 'Le site fermera ce mercredi 16 decembre de 10h00 a 20h00, le temps d''une grosse maintenance du code (passage a Doctrine =D).'); |
1 2 3 | <?php $requete = Doctrine_Query::create(); // Spécifications de la requête |
1 2 3 4 5 | <?php $requete = Doctrine_Query::create() // On crée une requête. ->from('news') // On veut les enregistrements de la table news. ->execute(); // On exécute la requête. ?> |

1 2 3 4 5 6 | <?php // On parcourt les résultats de la requête. foreach($requete as $news) { // On affiche le titre de chaque news. echo $news->titre.'<br />'; } |

C'est une exception que nous verrons dans une autre partie. 
1 2 3 4 5 6 7 8 | <?php $requete = Doctrine_Query::create() ->select('titre, auteur') ->from('news n') ->orderBy('titre') ->groupBy('auteur') ->limit(2); // N'oubliez pas de rajouter le execute() si vous voulez utiliser la requête par la suite. |
1 2 3 4 5 6 7 | <?php $requete = Doctrine_Core::getTable('News')->findAll(); foreach($requete as $news) { echo $news->titre.', par <strong>'.$news->auteur.'</strong><br />'; } |

1 2 3 4 5 6 | <?php // On veut la news n° 1. $news = Doctrine_Core::getTable('News')->find(1); // Notre objet ne contient forcément qu'un seul enregistrement, on peut l'afficher sans avoir à faire de foreach. echo $news->titre.', par <strong>'.$news->auteur.'</strong>'; |
1 2 3 4 5 6 7 8 9 | <?php // On veut éditer la news numéro 1. $requete = Doctrine_Core::getTable('News')->find(1); // On modifie ses attributs. $requete->titre = 'Mon nouveau titre'; // Puis on sauvegarde. $requete->save(); |


1 2 3 4 5 6 7 8 9 10 11 12 | <?php class NewsTable extends Doctrine_Table { public function recupererNews($nombreNews) { $q = Doctrine_Query::create() ->from('news') ->orderBy('id DESC') ->limit((int) $nombreNews); return $q; } } |
1 2 3 4 5 | <?php $news = Doctrine_Core::getTable('News'); foreach($news->recupererNews(2)->execute() as $news) { echo $news->titre.'<br />'; } |

1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php // Souvenez-vous, le nom du modèle reste au singulier. class Commentaire extends Doctrine_Record { public function setTableDefinition() { $this->setTableName('commentaires'); $this->hasColumn('id', 'integer', 8, array('primary' => true, 'autoincrement' => true)); $this->hasColumn('id_news', 'integer', 8); $this->hasColumn('contenu', 'string', 4000); } } |
1 2 3 4 5 6 7 8 9 10 | <?php public function setUp() { $this->[type de la relation]( 'NomDeLaTableARelier [as Alias]', array( 'local' => 'clé locale', 'foreign' => 'clé étrangère' ) ); } |
1 | SELECT titre FROM news n |
1 | SELECT n.titre FROM news n |
1 2 3 4 5 6 7 8 9 10 | <?php public function setUp() { $this->hasMany( 'Commentaire as commentaires', array( 'local' => 'id', 'foreign' => 'id_news' ) ); } |

1 2 3 4 5 6 7 8 9 10 | <?php public function setUp() { $this->hasOne( 'News as news', array( 'local' => 'id_news', 'foreign' => 'id' ) ); } |

1 2 3 4 5 6 7 8 9 10 | <?php // Les inclusions et la connexion try { $table = Doctrine_Core::getTable('Commentaire'); // On récupère l'objet de la table. $doctrine->export->createTable($table->getTableName(), $table->getColumns()); // Puis on la crée. echo 'La table a bien été créée'; } catch(Doctrine_Connection_Exception $e) { // Si une exception est lancée. echo $e->getMessage(); // On l'affiche. } |
1 2 3 4 5 6 7 8 | INSERT INTO `commentaires` (`id`, `id_news`, `contenu`) VALUES (1, 1, 'Cool cette ouverture. :)'), (2, 2, 'Quel dommage !'), (3, 1, 'Vraiment bien ca :)'); DELETE FROM news; INSERT INTO `news` (`id`, `titre`, `auteur`, `contenu`) VALUES (1, 'Ouverture du site', 'christophetd', 'Le site ouvre. :)'), (2, 'Fermeture du site', 'vyk12', 'Le site ferme. :('); |
1 2 3 4 5 6 | <?php $liste_news = Doctrine_Query::create() // Création de la requête ->select('n.titre, c.contenu') // On sélectionne le titre de la news et les commentaires associés. ->from('news n') ->leftJoin('n.commentaires c') // On joint les deux tables. ->execute(); // Et enfin, on exécute la requête. |
1 2 3 4 5 | <?php $this->hasMany( 'Commentaires as commentaires' /* <-- */, ... ); |
1 2 3 4 | <?php foreach($liste_news as $news) { echo $news->titre.'<br />'; } |

La liste de tous les commentaires est contenue dans $news->commentaires !1 2 3 4 5 6 7 8 9 10 | <?php foreach($liste_news as $news) { echo $news->titre.'<br />'; echo '<p>Commentaires sur cette news :'; echo '<ul>'; foreach($news->commentaires as $commentaire) { echo '<li>'.$commentaire->contenu.'</li>'; } echo '</ul></p><hr />'; } |


).