HANDS ON DOCTRINE :: An Interactive One Hour Tutorial on Doctrine's ORM for PHP

---------------------------------------------------------------------------------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Doctrine Learning in One Hour</title>
<?php
/*
 * File: doctrine_learning.php
 * Date: 03/04/2008
 * Version: 0.0.1
 * Author: Jaume Teixi <jaume@teixi.net>
Copyright (c) 2008 Jaume Teixi

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/

// 01 Connection and model loading

ini_set("display_errors","1");

require_once(
'path-to/Doctrine-0.10.3/Doctrine-0.10.3/lib/Doctrine.php');

Doctrine::debug(true);

spl_autoload_register(array('Doctrine''autoload'));

Doctrine_Manager::getInstance()->setAttribute('model_loading''conservative'); // 'conservative' 'aggressive'
Doctrine::loadModels('news');

$dsn 'mysql:dbname=my_test;host=127.0.0.1';
$user 'my_test';
$password 'my_test69';

try {
    
$dbh = new PDO($dsn$user$password);
} catch (
PDOException $e) {
    echo 
'Connection failed: ' $e->getMessage();
}

$conn Doctrine_Manager::getInstance()->openConnection($dbh);



// 02 Insert three rows into SYS_LANG

$c[0]='ca_ES';
$q = new Doctrine_Query ();
$r $q ->from('SysLang sl')
    ->
where('sl.id = ?')
    ->
fetchArray($c);
$num=$q->count($c);
if(
1>$num || null==$num){
    
$sl = new SysLang();
    
$sl->id=$c[0];
    
$sl->active='1';
    
$sl->updated=date(c);
    
$sl->updater='Teixi';
    
$sl->save(); 
}

$c[0]='es_ES';
$q = new Doctrine_Query ();
$r $q ->from('SysLang sl')
    ->
where('sl.id = ?')
    ->
fetchArray($c);
$num=$q->count($c);
if(
1>$num || null==$num){
    
$sl = new SysLang();
    
$sl->id=$c[0];
    
$sl->active='1';
    
$sl->updated=date(c);
    
$sl->updater='Teixi';
    
$sl->save(); 
}

$c[0]='en_US';
$q = new Doctrine_Query ();
$r $q ->from('SysLang sl')
    ->
where('sl.id = ?')
    ->
fetchArray($c);
$num=$q->count($c);
if(
1>$num || null==$num){
    
$sl = new SysLang();
    
$sl->id=$c[0];
    
$sl->active='1';
    
$sl->updated=date(c);
    
$sl->updater='Teixi';
    
$sl->save(); 
}



// 03 Retrieve rows from SYS_LANG

$q = new Doctrine_Query ();
$result $q ->from('SysLang sl')->fetchArray();

echo 
"<br />03 Results SYS_LANG:<br />";
foreach(
$result as $row) {
    foreach(
$row as $column) {
        echo 
$column." | ";
    }
    echo 
"<br />";
}



// 04 Insert language definitions in TRANS_LANG

// catalan
$c[0]='ca_ES';
$c[1]='ca_ES';
$q = new Doctrine_Query ();
$r $q ->from('TranslLang tl')
    ->
where(' tl.id_lang = ? AND tl.id_trad = ? ')
    ->
fetchArray($c);
$num=$q->count($c);
if(
1>$num || null==$num){
    
$tl = new TranslLang();
    
$tl->id_lang=$c[0];
    
$tl->id_trad=$c[1];
    
$tl->description='Català';
    
$tl->save(); 
}

$c[0]='ca_ES';
$c[1]='es_ES';
$q = new Doctrine_Query ();
$r $q ->from('TranslLang tl')
    ->
where(' tl.id_lang = ? AND tl.id_trad = ? ')
    ->
fetchArray($c);
$num=$q->count($c);
if(
1>$num || null==$num){
    
$tl = new TranslLang();
    
$tl->id_lang=$c[0];
    
$tl->id_trad=$c[1];
    
$tl->description='Catalán';
    
$tl->save(); 
}

$c[0]='ca_ES';
$c[1]='en_US';
$q = new Doctrine_Query ();
$r $q ->from('TranslLang tl')
    ->
where(' tl.id_lang = ? AND tl.id_trad = ? ')
    ->
fetchArray($c);
$num=$q->count($c);
if(
1>$num || null==$num){
    
$tl = new TranslLang();
    
$tl->id_lang=$c[0];
    
$tl->id_trad=$c[1];
    
$tl->description='Catalan';
    
$tl->save(); 
}

// spanish
$c[0]='es_ES';
$c[1]='ca_ES';
$q = new Doctrine_Query ();
$r $q ->from('TranslLang tl')
    ->
where(' tl.id_lang = ? AND tl.id_trad = ? ')
    ->
fetchArray($c);
$num=$q->count($c);
if(
1>$num || null==$num){
    
$tl = new TranslLang();
    
$tl->id_lang=$c[0];
    
$tl->id_trad=$c[1];
    
$tl->description='Espanyol';
    
$tl->save(); 
}

$c[0]='es_ES';
$c[1]='es_ES';
$q = new Doctrine_Query ();
$r $q ->from('TranslLang tl')
    ->
where(' tl.id_lang = ? AND tl.id_trad = ? ')
    ->
fetchArray($c);
$num=$q->count($c);
if(
1>$num || null==$num){
    
$tl = new TranslLang();
    
$tl->id_lang=$c[0];
    
$tl->id_trad=$c[1];
    
$tl->description='Español';
    
$tl->save(); 
}

$c[0]='es_ES';
$c[1]='en_US';
$q = new Doctrine_Query ();
$r $q ->from('TranslLang tl')
    ->
where(' tl.id_lang = ? AND tl.id_trad = ? ')
    ->
fetchArray($c);
$num=$q->count($c);
if(
1>$num || null==$num){
    
$tl = new TranslLang();
    
$tl->id_lang=$c[0];
    
$tl->id_trad=$c[1];
    
$tl->description='Spanish';
    
$tl->save(); 
}

// spanish
$c[0]='en_US';
$c[1]='ca_ES';
$q = new Doctrine_Query ();
$r $q ->from('TranslLang tl')
    ->
where(' tl.id_lang = ? AND tl.id_trad = ? ')
    ->
fetchArray($c);
$num=$q->count($c);
if(
1>$num || null==$num){
    
$tl = new TranslLang();
    
$tl->id_lang=$c[0];
    
$tl->id_trad=$c[1];
    
$tl->description='Anglès';
    
$tl->save(); 
}

$c[0]='en_US';
$c[1]='es_ES';
$q = new Doctrine_Query ();
$r $q ->from('TranslLang tl')
    ->
where(' tl.id_lang = ? AND tl.id_trad = ? ')
    ->
fetchArray($c);
$num=$q->count($c);
if(
1>$num || null==$num){
    
$tl = new TranslLang();
    
$tl->id_lang=$c[0];
    
$tl->id_trad=$c[1];
    
$tl->description='Inglés';
    
$tl->save(); 
}

$c[0]='en_US';
$c[1]='en_US';
$q = new Doctrine_Query ();
$r $q ->from('TranslLang tl')
    ->
where(' tl.id_lang = ? AND tl.id_trad = ? ')
    ->
fetchArray($c);
$num=$q->count($c);
if(
1>$num || null==$num){
    
$tl = new TranslLang();
    
$tl->id_lang=$c[0];
    
$tl->id_trad=$c[1];
    
$tl->description='English';
    
$tl->save(); 
}

// 05 Retrieve rows from TRANS_LANG

$q = new Doctrine_Query ();
$result $q ->from('TranslLang tl')->fetchArray();

echo 
"<br />05 Results TRANSL_LANG:<br />";
foreach(
$result as $row) {
    foreach(
$row as $column) {
        echo 
$column." | ";
    }
    echo 
"<br />";
}



// 06 Add a row in CONT_NEWS and each language content as three rows in TRANSL_NEWS

$c[0]='ca_ES';
$c[1]='1';
$c[2]='Primera Notícia de Prova';
$q = new Doctrine_Query ();
$r $q ->from('TranslNews tl')
    ->
where(' tl.id_lang = ? AND tl.id_news = ? AND tl.title = ? ')
    ->
fetchArray($c);
$num=$q->count($c);
if(
1>$num || null==$num){
    
$cn = new ContNews();
    
$cn->active='1';
    
$cn->updated=$cn->created=date(c);
    
$cn->updater=$cn->creator='Teixi';
    
$cn->save();
    
$id_n=$cn->get('id');

    
// Insert Catalan    
    
$tn = new TranslNews();
    
$tn->id_news=$id_n;
    
$tn->id_lang='ca_ES';
    
$tn->title='Primera Notícia de Prova';
    
$tn->body='Aquest és el contingut de la Primera notícia de Prova';
    
$tn->save();

    
// Insert Spanish
    
$tn = new TranslNews();
    
$tn->id_news=$id_n;
    
$tn->id_lang='es_ES';
    
$tn->title='Primera Notícia de Prueba';
    
$tn->body='Este es el contenido de la primera notícia de Prueba';
    
$tn->save();
}
// Check English and if not exists insert it
$c1[0]='en_US';
$c1[1]='1';
$q = new Doctrine_Query ();
$r $q ->from('TranslNews tl')
    ->
where(' tl.id_lang = ? AND tl.id_news = ? ')
    ->
fetchArray($c1);
$num=$q->count($c1);
if(
1>$num || null==$num){
    
$tn = new TranslNews();
    
$tn->id_news='1';
    
$tn->id_lang='en_US';
    
$tn->title='First News of Test';
    
$tn->body='This is the content of the first news of testing';
    
$tn->save();
}


// 07 Retrieve rows from VIEW_NEWS

$q = new Doctrine_Query ();
$result $q ->from('ViewNews vn')->fetchArray();

echo 
"<br />07 Results VIEW_NEWS:<br />";
foreach(
$result as $row) {
    foreach(
$row as $column) {
        echo 
$column." | ";
    }
    echo 
"<br />";
}



// 08 Test Delete  a row in TRANSL_NEWS
$q = new Doctrine_Query();
$d[0]='1';
$d[1]='en_US';
$r $q->delete('tl.*')
                  ->
from('TranslNews tl')
                  ->
where('tl.id_news = ? AND tl.id_lang = ? ')
                  ->
execute($d);            
echo 
"<br />08 deleted=$r on TranslNews where id_news=$d[0] and id_lang=$d[1] <br />";

// retrieve view after delete
$q = new Doctrine_Query ();
$result $q ->from('ViewNews vn')->fetchArray();

echo 
"<br />08 Results VIEW_NEWS:<br />";
foreach(
$result as $row) {
    foreach(
$row as $column) {
        echo 
$column." | ";
    }
    echo 
"<br />";
}



// 09 Re-add again en_US
$tn = new TranslNews();
$tn->id_news='1';
$tn->id_lang='en_US';
$tn->title='First News of Test';
$tn->body='This is the content of the first news of testing';
$tn->save();

// retrieve view after re-add
$q = new Doctrine_Query ();
$result $q ->from('ViewNews vn')->fetchArray();

echo 
"<br />09 Results VIEW_NEWS:<br />";
foreach(
$result as $row) {
    foreach(
$row as $column) {
        echo 
$column." | ";
    }
    echo 
"<br />";
}



// 10 Update en_US
$u[0]='Updated: First News of Test ! '.date("s");
$u[1]='Updated: This is the content of the first news for testing ! '.date("s");
$u[2]='en_US';
$u[3]='1';
$k= new Doctrine_Query();
$k->update('TranslNews tl')
    ->
set('tl.title''?')
    ->
set('tl.body''?')                                      
    ->
where(' tl.id_lang = ? AND tl.id_news = ? ');  
$z=$k->execute($u);
    
echo
"<br />10 updated=$z on TranslNews where id_news=$u[3] and id_lang=$u[2] <br />";

// retrieve view after update
$q = new Doctrine_Query ();
$result $q ->from('ViewNews vn')->fetchArray();

echo 
"<br />10 Results VIEW_NEWS:<br />";
foreach(
$result as $row) {
    foreach(
$row as $column) {
        echo 
$column." | ";
    }
    echo 
"<br />";
}



// 11 Retrieve Partial Data
$q = new Doctrine_Query ();
$result $q ->from('ViewNews vn')->fetchArray();

echo 
"<br />11 Results VIEW_NEWS:<br />";
foreach(
$result as $row) {
    echo 
$row[title]." :: ".$row[body];
    echo 
"<br />";
}



// 12 Raw Sql
$q = new Doctrine_RawSql();
$q->select('{v.*}')
    ->
from('VIEW_NEWS v')
    ->
addComponent('v''ViewNews v');
$s=$q->getSql();
echo
"<br />12 raw sql query= $s <br />";
$result $q->execute();
echo 
"<br />12 Results Raw SQL: <br />";
foreach(
$result as $row) {
    foreach(
$row as $column) {
        echo 
$column." | ";
    }
    echo 
"<br />";
}

---------------------------------------------------------------------------------------------

... back ...



2008-04-07 jaume@teixi.net on Teixi.net