<?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>Blog cakephp en español por Hospedaxes &#187; sql</title>
	<atom:link href="http://cakephp.hospedaxes.com/tag/sql/feed" rel="self" type="application/rss+xml" />
	<link>http://cakephp.hospedaxes.com</link>
	<description>Blog sobre desarrollo web con cakephp en español por Hospedaxes</description>
	<lastBuildDate>Mon, 26 Apr 2010 07:11:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Consultas complejas con cakephp</title>
		<link>http://cakephp.hospedaxes.com/consultas-complejas-con-cakephp</link>
		<comments>http://cakephp.hospedaxes.com/consultas-complejas-con-cakephp#comments</comments>
		<pubDate>Mon, 23 Mar 2009 13:07:43 +0000</pubDate>
		<dc:creator>bernal</dc:creator>
				<category><![CDATA[Noticias]]></category>
		<category><![CDATA[cakephp-1.2]]></category>
		<category><![CDATA[between]]></category>
		<category><![CDATA[busquedas complejas]]></category>
		<category><![CDATA[cakephp]]></category>
		<category><![CDATA[find]]></category>
		<category><![CDATA[in]]></category>
		<category><![CDATA[nor]]></category>
		<category><![CDATA[not]]></category>
		<category><![CDATA[or]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[xor]]></category>

		<guid isPermaLink="false">http://cakephp.hospedaxes.com/?p=151</guid>
		<description><![CDATA[El framework cakephp tiene una definición de los modelos muy potente, lo que hace que sea muy fácil acceder a los datos de la base de datos, realizando consultas todo lo complejas que se desee.
En esta entrada hablaremos de todas las posiblidades, que tal vez no conozcáis, de establecer las condiciones de una consulta en [...]]]></description>
			<content:encoded><![CDATA[<p>El framework cakephp tiene una definición de los modelos muy potente, lo que hace que sea muy fácil acceder a los datos de la base de datos, realizando consultas todo lo complejas que se desee.<br />
En esta entrada hablaremos de todas las posiblidades, que tal vez no conozcáis, de establecer las condiciones de una consulta en cakephp.</p>
<p><strong>Consulta sencilla</strong></p>
<p>Las consultas más simples, que afectan a una única columna son fáciles de realizar, se resuelven con un find y la condición pasada como un parámetro en la llamada a este método.</p>
<p>De esta manera:</p>
<pre class="prettyprint">$this->Modelo->find('all',array('conditions'=>'Modelo.columna = valor'))</pre>
<p>se generará un select con una condición </p>
<pre class="prettyprint">where Modelo.columna = valor</pre>
<p><strong>Consulta con varias condiciones separadas por AND</strong></p>
<p>Surge la duda de ¿qué sucede si deseamos realizar una consulta con varias condiciones?, se podría hacer poniendo como segundo parámetro del array conditions una cadena con todas las condiciones concatenadas con AND entre ellas, pero cakephp ya pensó en eso y hay una manera más sencilla y más limpia de hacerlo, que es pasar un array con todas las condiciones que deseamos que cumpla la consulta, con el formato Modelo.columna =&gt; valor :</p>
<p>De esta manera:</p>
<pre class="prettyprint">$this->Modelo->find('all',array('conditions'=>array('Modelo.columna' => 'valor','Modelo.columna2' => 'valor2')))</pre>
<p>Esta llamada generará una consulta con una condición</p>
<pre class="prettyprint">where Modelo.columna = valor1 AND Modelo.columna2 = valor2</pre>
<p><strong>Consulta utilizando <>, <=, >=, > o <</strong></p>
<p>Si en lugar de querer que todas las columnas coincidan con los valores que se les pasan en el array, queremos que alguna columna sea distinta del valor, la condición debería tener este formato</p>
<pre class="prettyprint">$this->Modelo->find('all',array('conditions'=>array('Modelo.columna <>' => 'valor','Modelo.columna2' => 'valor2')))</pre>
<p>Esta llamada generará una consulta con una condición </p>
<pre class="prettyprint">where Modelo.columna <> valor1 AND Modelo.columna2 = valor2</pre>
<p>Este formato también permitiría además de utilizar el distinto de (<>), utlizar mayor que (>) ,mayor o igual que (>=), menor que (<) o menor o igual que (<=).</p>
<p><strong>Consulta utilizando OR</strong></p>
<p>Una nueva duda surge cuando se nos plantea, ¿qué pasa si en lugar de realizar una consulta con condiciones separadas con AND queremos crear una consulta con las condiciones separada por OR?, pues cakephp también permite hacerlo de manera muy sencilla, creando un find con el siguiente formato:</p>
<pre class="prettyprint">$this->Modelo->find('all',array('conditions'=>array('OR'=>array('Modelo.columna' => 'valor','Modelo.columna2' => 'valor2'))))</pre>
<p>Esto creará una consulta con una condición </p>
<pre class="prettyprint">where Modelo.columna = valor OR Modelo.columna2 => valor2</pre>
<p>Esta opción se puede utilizar con cualquiera de los operadores booleanos AND, OR, NOT, XOR.</p>
<p>Cakephp también permite otras opciones más complejas:</p>
<p><strong>Consulta utilizando IN</strong></p>
<p>¿Qué sucede si queremos utilizar una consulta en la que queramos que una columna coincida con una serie de valores?. Para esto, lo más sencillo sería utilizar la sentencia sql in.<br />
Instintivamente la primera idea que podemos tener para crear una consulta de este tipo es generar una cadena con todos los valores que deseamos pasarle a la consulta y esto concatenarlo con Modelo.columna IN.<br />
Cakephp ya había pensado en esto y ha hecho que sea mucho más sencillo que todo esto, para realizar una consulta con un IN como condición habrá que pasarle un array con los valores que queramos que se compruebe la coincidencia, de este modo:</p>
<pre class="prettyprint">
$valores = array(1,2,3,4,5,6);
$this->Modelo->find('all',array('conditions'=>array('Modelo.columna' => $valores,'Modelo.columna2' => 'valor2')))</pre>
<pre class="prettyprint">where Modelo.columna in (1,2,3,4,5,6) AND Modelo.columna2 => valor2</pre>
<p><strong>Consulta utilizando NOT IN</strong></p>
<p>Si en lugar de que se compruebe la coincidencia con ciertos valores, se compruebe la no coincidencia <strong>(NOT IN)</strong>, haremos la llamada de esta manera:</p>
<pre class="prettyprint">
$valores = array(1,2,3,4,5,6);
$this->Modelo->find('all',array('conditions'=>array('NOT'=>array('Modelo.columna' => $valores),'Modelo.columna2' => 'valor2')))</pre>
<pre class="prettyprint">where Modelo.columna in (1,2,3,4,5,6) AND Modelo.columna2 => valor2</pre>
<p><strong>Consulta utilizando BETWEEN</strong></p>
<p>Podría darse la posibilidad de tener que comprobar si el valor de un campo está contenido entre dos valores dados (BETWEEN), para esto igual que para la expresión in se nos ocurriría crear una cadena concatenando los valores y la sentencia sql, pero cakephp permite una forma mucho más sencilla de crearlo:</p>
<pre class="prettyprint">
$this->Modelo->find('all',array('conditions'=>array(array('Modelo.columna BETWEEN ? AND ?' => array(1,8)))))</pre>
<p>Esta llamada al find crearía una consulta sql con la siguiente condición:</p>
<pre class="prettyprint">where Modelo.columna between 1 AND 8</pre>
<p>Con todas estas opciones se podrían crear consultas tan complejas como deseemos sin tener que preocuparnos de generar cadenas con el código sql para concatenar a las condiciones, de una manera muy sencilla e intuitiva.</p>
]]></content:encoded>
			<wfw:commentRss>http://cakephp.hospedaxes.com/consultas-complejas-con-cakephp/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
