<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>TecnoRetales &#187; ORM</title>
	<atom:link href="http://www.tecnoretales.com/tag/orm/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tecnoretales.com</link>
	<description>La experiencia no se olvida</description>
	<lastBuildDate>Wed, 07 Jul 2010 21:23:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<!-- google ad injected by adsense-optimizer http://www.adsenseoptimizer.de -->
			<div  style="padding:7px; float: right; padding-right: 0; margin: 3px;"><!-- Ad number: 1 --><script type="text/javascript"><!--
    	 
    	google_ad_client = "pub-7180773421652966"; google_alternate_color = "FFFFFF";
		google_ad_width = 468; google_ad_height = 60;
		google_ad_format = "468x60_as"; google_ad_type = "text";
		google_ad_channel =""; google_color_border = "FE8B00";
		google_color_link = "FE8B00"; google_color_bg = "FFFFFF";
		google_color_text = "000000"; google_color_url = "D9D9D9";
		google_ui_features = "rc:6"; //--></script>
		<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script></div>	<item>
		<title>Crear una relación many-to-many con Doctrine</title>
		<link>http://www.tecnoretales.com/programacion/crear-una-relacion-many-to-many-con-doctrine/</link>
		<comments>http://www.tecnoretales.com/programacion/crear-una-relacion-many-to-many-con-doctrine/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 06:10:17 +0000</pubDate>
		<dc:creator>Manel Pérez Mata</dc:creator>
				<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.tecnoretales.com/?p=538</guid>
		<description><![CDATA[Vamos a ver como informar al magnífico ORM Doctrine de que debe tratar un par de tablas con una relación many-to-many utilizando una tabla intermedia.
Supongamos que tenemos una talba de jugadores de fútbol y una tabla de equipos. Un equipo estará compuesto por varios jugadores y a su vez, un jugador puede estar relacionado con [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p>Vamos a ver como informar al magnífico <a title="Qué es Doctrine ORM?" href="http://www.tecnoretales.com/programacion/que-es-doctrine-orm/">ORM Doctrine</a> de que debe tratar un par de tablas con una <strong>relación many-to-many</strong> utilizando una tabla intermedia.</p>
<p>Supongamos que tenemos una talba de jugadores de fútbol y una tabla de equipos. Un equipo estará compuesto por varios jugadores y a su vez, un jugador puede estar relacionado con varios equipos (el actual, más los equipos por los que ha pasado en su vida deportiva).</p>
<p>Para este ejemplo necesitaremos tres tablas: Team, Player  y una relacional TeamPlayer. <span id="more-538"></span>El schema.yml de este escenario sería:</p>
<pre class="brush: plain;"># Player table
Player:
  tableName: player
  columns:
    id:
      type: integer(4)
      unsigned: 1
      primary: true
      autoincrement: true
    first_name: string(255)
    last_name: string(255)
    weight: float(2147483647)
    height: float(2147483647)
  relations:
    Team:
      &lt;strong&gt;class&lt;/strong&gt;: Team
      &lt;strong&gt;local&lt;/strong&gt;: player_id
      &lt;strong&gt;foreign&lt;/strong&gt;: team_id
      &lt;strong&gt;refClass&lt;/strong&gt;: TeamPlayer

#Team table
tableName: team
  columns:
    id:
      type: integer(4)
      unsigned: 1
      primary: true
      autoincrement: true
    name: string(255)
  relations:
    Player:
      &lt;strong&gt;class&lt;/strong&gt;: Player
      &lt;strong&gt;local&lt;/strong&gt;: team_id
      &lt;strong&gt;foreign&lt;/strong&gt;: player_id
      &lt;strong&gt;refClass&lt;/strong&gt;: TeamPlayer

#TeamPlayer table
TeamPlayer:
  tableName: team_player
  columns:
    team_id:
      type: integer(4)
      unsigned: 1
      primary: true
    player_id:
      type: integer(4)
      unsigned: 1
      primary: true</pre>
<p>Los puntos importantes están en las relaciones de las tablas Team y Player, donde indicaremos los campos:</p>
<ul>
<li><strong><span style="text-decoration: underline;">class</span>:</strong> La clase encargada de manejar el objeto relacionado.</li>
<li><strong><span style="text-decoration: underline;">local</span>:</strong> El nombre del campo que hace de vínculo entre la tabla en la que estoy y la tabla relacional TeamPlayer</li>
<li><strong><span style="text-decoration: underline;">foreign</span>:</strong> El nombre del campo que hace de vínculo entre la tabla relacionada y la tabla relacional TeamPlayer</li>
<li><strong><span style="text-decoration: underline;">refClass</span>:</strong> Nombre del objeto encargado de realizar la relación</li>
</ul>
<p>Siguiendo estos pasos podremos acceder a todos los equipos de un jugador y a todos los jugadores de un equipo sin ningún problema.</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.tecnoretales.com/programacion/crear-una-relacion-many-to-many-con-doctrine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configurar Doctrine en Symfony</title>
		<link>http://www.tecnoretales.com/bases-de-datos/configurar-doctrine-en-symfony/</link>
		<comments>http://www.tecnoretales.com/bases-de-datos/configurar-doctrine-en-symfony/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 14:23:27 +0000</pubDate>
		<dc:creator>Manel Pérez Mata</dc:creator>
				<category><![CDATA[Bases de datos]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.tecnoretales.com/?p=496</guid>
		<description><![CDATA[ Symfony integra Propel ORM por defecto, sin embargo, Doctrine está ganando puntos sobre su rival.
La principal ventaja de cada uno de ellos es:
Propel: Está completamente integrado con Symfony y decenas de plugins sólo funcionan para Propel.
Doctrine: Tiene muy buen rendimiento en ejecución y una forma muy concisa al escribir consultas complejas.
Si te has decidido [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><img class="alignleft size-full wp-image-497" src="http://www.tecnoretales.com/wp-content/uploads/2009/07/doctrine.gif" alt="Doctrine Logo" width="191" height="53" /> Symfony integra Propel ORM por defecto, sin embargo, Doctrine está ganando puntos sobre su rival.</p>
<p>La principal ventaja de cada uno de ellos es:</p>
<p><strong>Propel:</strong> Está completamente integrado con Symfony y decenas de plugins sólo funcionan para Propel.</p>
<p><strong>Doctrine:</strong> Tiene muy buen rendimiento en ejecución y una forma muy concisa al escribir consultas complejas.</p>
<p>Si te has decidido a utilizar Doctrine en lugar de Propel y no sabes como integrarlo con Symfony, aquí te dejo los pasos para activarlo.<span id="more-496"></span></p>
<ol>
<li>Lo primero que deberemos hacer es habilitar <em>sfDoctrinePlugin</em> y deshabilitar <em>sfPropelPlugin</em>, esto lo haremos editando el archivo <em>config/ProjectConfiguration.class.php </em>:
<pre class="brush: php;">
public function setup()
{
  $this-&gt;enablePlugins(array('sfDoctrinePlugin'));
  $this-&gt;disablePlugins(array('sfPropelPlugin'));
}
</pre>
<p>o si lo prefieres, puedes habilitar todos los plugins por defecto excepto los que no te interesen:</p>
<pre class="brush: php;">
public function setup()
{
  $this-&gt;enableAllPluginsExcept(array('sfPropelPlugin'));
}
</pre>
</li>
<li>Activado Doctrine, borraremos la caché para asegurarnos que se cargan nuestros cambios:<br />
<code>symfony cc</code></li>
<li>Crearemos una carpeta <em>doctrine</em> dentro de <em>config</em> que contendrá nuestro archivo <em>schema.yml</em> y listo, ya tenemos a Symfony funcionando con Doctrine</li>
<li>Ahora sólo queda abrir el archivo <em>config/databases.yml</em> y cambiar &#8220;<em>propel</em>&#8221; por &#8220;<em>doctrine</em>&#8221; (respetando mayúsculas y minúsculas) y eliminar la linea &#8220;<em>classname:  PropelPDO</em>&#8220;.</li>
</ol>
<p>Recordemos que a partir de ahora, deberemos utilizar la sintaxis Doctrine, tanto en nuestra definición del schema como en el modelo de nuestra aplicación. Si son tus primeros pasos con Doctrine, puedes ver su documentación original <a title="Doctrine Tutorial" href="http://www.doctrine-project.org/documentation/manual/1_1/en/introduction" target="_blank">aquí</a>.</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.tecnoretales.com/bases-de-datos/configurar-doctrine-en-symfony/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qué es Doctrine ORM?</title>
		<link>http://www.tecnoretales.com/programacion/que-es-doctrine-orm/</link>
		<comments>http://www.tecnoretales.com/programacion/que-es-doctrine-orm/#comments</comments>
		<pubDate>Fri, 03 Jul 2009 09:48:54 +0000</pubDate>
		<dc:creator>Manel Pérez Mata</dc:creator>
				<category><![CDATA[Bases de datos]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Doctrine]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://www.tecnoretales.com/?p=487</guid>
		<description><![CDATA[Qué es un ORM?
Un ORM o (Object Relation Mapper) es una técnica de programación que nos permite convertir datos entre el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y el utilizado en una base de datos relacional, es decir, las tablas de nuestra base de datos pasan a ser clases [...]]]></description>
			<content:encoded><![CDATA[<!-- google_ad_section_start --><p><strong>Qué es un ORM?</strong></p>
<p>Un ORM o (Object Relation Mapper) es una técnica de programación que nos permite convertir datos entre el sistema de tipos utilizado en un lenguaje de programación orientado a objetos y el utilizado en una base de datos relacional, es decir, las tablas de nuestra base de datos pasan a ser clases y los registros objetos que podemos manejar con facilidad.</p>
<p><img class="aligncenter size-full wp-image-489" title="fig02" src="http://www.tecnoretales.com/wp-content/uploads/2009/07/fig02.jpg" alt="fig02" width="362" height="438" /></p>
<p><span id="more-487"></span>Utilizar un ORM tiene una serie de ventajas que nos facilitan enormemente tareas comúnes y de mantenimiento:</p>
<ol>
<li><strong>Reutilización:</strong> La principal ventaja que aporta un ORM es la reutilización permitiendo llamar a los métodos de un objeto de datos desde distintas partes de la aplicación e incluso desde diferentes aplicaciones.</li>
<li><strong>Encapsulación:</strong> La capa ORM encapsula la lógica de los datos pudiendo hacer cambios que afectan a toda la aplicación únicamente modificando una función.</li>
<li><strong>Portabilidad:</strong> Utilizar una capa de abstracción nos permite cambiar en mitad de un proyecto de una base de datos MySQL a una Oracle sin ningún tipo de complicación. Esto es debido a que no utilizamos una sintaxis MySQL, Oracle o SQLite para acceder a nuestro modelo, sino una sintaxis propia del ORM utilizado que es capaz de traducir a diferentes tipos de bases de datos.</li>
<li><strong>Seguridad:</strong> Los ORM suelen implementar mecanísmos de seguridad que protegen nuestra aplicación de los ataques más comúnes como SQL Injections.</li>
<li><strong>Mantenimiento del código:</strong> Gracias a la correcta ordenación de la capa de datos, modificar y mantener nuestro código es una tarea sencilla.</li>
</ol>
<p><strong>Qué es Doctrine?</strong></p>
<p><img class="alignleft size-full wp-image-488" title="doctrine-logo" src="http://www.tecnoretales.com/wp-content/uploads/2009/07/doctrine-logo.png" alt="doctrine-logo" width="119" height="96" />Según la <a title="Doctrine ORM" href="http://www.doctrine-project.org/" target="_blank">documentación oficial</a>, Doctrine es un <strong>ORM para PHP</strong> 5.2.3 y posterior. Además de todas las ventajas que conlleva un ORM, uno de sus puntos fuertes es su lenguaje <strong>DQL</strong> (Doctrine Query Language) <strong>inspirado en el HQL de Hibernate</strong>.</p>
<p>Cuando trabajamos con Doctrine, necesitamos informar a su motor interno de cual es el modelo de nuestra aplicación, para ello podemos hacer <strong>ingeniería inversa</strong> de nuestra base de datos existente, o si empezamos la aplicación desde 0, crear el modelo en la sintaxis específica que nos propone Doctrine y luego generar toda la base de datos.</p>
<p>Para crear el modelo, doctrine nos da dos alternativas, hacer una clase por tabla e indicarle mediante PHP el tipo de datos que almacenaremos en él, un ejemplo:</p>
<pre class="brush: php;">// models/generated/BaseUser.php

class User extends BaseUser
{
    public function setTableDefinition()
    {
        $this-&gt;hasColumn('username', 'string', 255, array('default' =&gt; 'default username'));
        $this-&gt;hasColumn('name', 'string', 255, array('default' =&gt; 'default name'));
        $this-&gt;hasColumn('age', 'integer', 4, array('unsigned' =&gt; true));
        // ...
    }

    // ...
}</pre>
<p>O crear un esquema en <a title="Yaml" href="http://es.wikipedia.org/wiki/YAML" target="_blank">formato YAML</a> (<em>schema.yml</em>) similar a XML, pero bastante más legible. El equivalente al ejemplo anterior en YAML sería:</p>
<pre class="brush: plain;"># schema.yml

# ...
User:
# ...
  columns:
    username:
      type: string(255)
      default: default username
    name:
      type: string(255)
      default: default name
    age:
      type: integer(4)
      unsigned: true
    # ...</pre>
<p>Además de definir los campos de cada tabla, también le indicamos las relaciones que tienen con las otras tablas y su tipo (many-to-many, one-to-many, one-to-one&#8230;), lo que deja perfectamente estructurada nuestro modelo de datos y su manera de acceder a los valores.</p>
<p>Más adelante seguiré escribiendo sobre las ventajas de Doctrine y añadiendo ejemplos que considere interesantes y/o útiles.</p>
<!-- google_ad_section_end -->]]></content:encoded>
			<wfw:commentRss>http://www.tecnoretales.com/programacion/que-es-doctrine-orm/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
