Sentencias SQL
Lo primero que aprenderemos en este capítulo será a realizar sentencias SQL desde Laravel 4. Revisaremos las funciones para realizar un SELECT, INSERT, UPDATE y DELETE. Para realizar este tipo de sentencias solo es necesario tener configurado los parámetros de conexión a la base de datos, lo cual aprendimos a hacer en los pasados capítulos de esta serie. Todas estas consultas se realizan haciendo uso de la clase DB.
Select
Para la realización de un SELECT hacemos uso de la función estática select, esta regresara un arreglo con objetos. Cada objeto es cada tupla que la consulta regresa. La función puede recibir dos parámetros, el primero es obligatorio y es el texto con al consulta. El segundo parámetro es opcional y consiste en un arreglo con las variables que se le quieran pasar a la consulta, para esto se coloca en la consulta un sigo de interrogación en donde se quiere sustituir alguna variable. Veamos un ejemplo de esto:
$resultado = DB::select('SELECT * FROM carros WHERE color = ?', array('blanco')); // En este caso ? será remplazado por blanco // SELECT * FROM carros WHERE color = 'Blanco'123 $resultado=DB::select('SELECT * FROM carros WHERE color = ?',array('blanco'));// En este caso ? será remplazado por blanco // SELECT * FROM carros WHERE color = 'Blanco'
Esta consulta retorna el siguiente arreglo:
array(1) { [0]=> array(2) { [0]=> object(stdClass)#124 (6) { ["id"]=> string(1) "2" ["modelo"]=> string(8) "Corrolla" ["color"]=> string(6) "Blanco" ["placa"]=> string(7) "MGF 333" ["created_at"]=> string(19) "2013-09-16 13:51:33" ["updated_at"]=> string(19) "2013-09-16 13:51:33" } [1]=> object(stdClass)#125 (6) { ["id"]=> string(1) "5" ["modelo"]=> string(4) "Meru" ["color"]=> string(6) "Blanco" ["placa"]=> string(7) "DJF 333" ["created_at"]=> string(19) "2013-09-16 13:51:33" ["updated_at"]=> string(19) "2013-09-16 13:51:33" } } }1234567891011121314151617181920212223242526272829303132333435 array(1){ [0]=> array(2){ [0]=> object(stdClass)#124 (6) { ["id"]=> string(1)"2" ["modelo"]=> string(8)"Corrolla" ["color"]=> string(6)"Blanco" ["placa"]=> string(7)"MGF 333" ["created_at"]=> string(19)"2013-09-16 13:51:33" ["updated_at"]=> string(19)"2013-09-16 13:51:33" } [1]=> object(stdClass)#125 (6) { ["id"]=> string(1)"5" ["modelo"]=> string(4)"Meru" ["color"]=> string(6)"Blanco" ["placa"]=> string(7)"DJF 333" ["created_at"]=> string(19)"2013-09-16 13:51:33" ["updated_at"]=> string(19)"2013-09-16 13:51:33" } }}
Podemos observar que es un arreglo con objetos. En donde cada objeto es una fila de la consulta que se realizo a la base de datos.
Insert
Para insertar en la base de datos sin utilizar los modelos utilizamos la función estática insert. Esta función no retorna nada y al igual que la función select, recibe dos parámetros. El primero es la sentencia y el segundo es el arreglo con los valores a insertar.
DB::insert("INSERT INTO carros (id, modelo, color, placa) VALUES (NULL, ?, ?, ?)", array('QQ', 'Verde', 'GFT 888') ); // Podemos observar como se sustituyen los valores en las posiciones de los ?12 DB::insert("INSERT INTO carros (id, modelo, color, placa) VALUES (NULL, ?, ?, ?)",array('QQ','Verde','GFT 888'));// Podemos observar como se sustituyen los valores en las posiciones de los ?
Update
Para realizar un UPDATE utilizamos la función estática update, igual que las anteriores, esta recibe dos parámetros. El primero es la sentencia SQL y el segundo es el arreglo con los paramtros. Esta función devuelve un número entero con la cantidad de filas que fueron editadas cuando se ejecuto el UPDATE.
$filas_editadas = DB::update('UPDATE carros SET placa = ? WHERE id = ? ', array( 'JUH 111', 2));1 $filas_editadas=DB::update('UPDATE carros SET placa = ? WHERE id = ? ',array('JUH 111',2));
Delete
Por ultimo veremos como hacer uso de la sentencia DELETE con la función estática delete. Al igual que update, recibe dos parametros y retorna un entero con la cantidad de filas borradas.
$cantidad_borradas = DB::delete('DELETE FROM carros WHERE id = ? ', array(6) );1 $cantidad_borradas=DB::delete('DELETE FROM carros WHERE id = ? ',array(6));
Query Builder
Laravel 4 cuenta con una librería para crear las sentencias SQL con POO ( Programación Orientada a Objetos), de esta manera nos evitamos escribir SQL directamente. Utilizando esta librería para hacer las consultas, nos evitamos inyección de SQL y nuestras consultas funcionaran en todas las base datos sin ningún problema, ya que Laravel será quien escriba la sentencia. Por último debemos saber que esta librería funciona mediante encadenamiento de métodos, sobre lo cual veremos un ejemplo a continuación.
Class::creador()->cadena()->cadena()->cadena()->disparador(); // Primero se debe poner un creador que es quien instancia la clase. // Luego se le pueden pasar métodos opcionales que modifican la instancia // Por ultimo se debe usar un disparador que es quien retorna el resultado12345 Class::creador()->cadena()->cadena()->cadena()->disparador(); // Primero se debe poner un creador que es quien instancia la clase. // Luego se le pueden pasar métodos opcionales que modifican la instancia// Por ultimo se debe usar un disparador que es quien retorna el resultado
Ahora veamos un ejemplo con métodos reales:
$usuarios = DB::table('usuarios')->where('sexo', '=', 'M')->get(); // SELECT * FROM usuarios WHERE sexo = 'M'12 $usuarios=DB::table('usuarios')->where('sexo','=','M')->get();// SELECT * FROM usuarios WHERE sexo = 'M'
Esta consulta retorna un arreglo de objeto con todos los resultados obtenidos de la base de datos. table(‘usuarios’) crea el objeto para ser usado con la tabla de usuarios, where() es el modificador encadenado y get() es el disparador que retorna el arreglo de objetos.
Disparadores
Veamos una lista con los diferentes disparadores:
- get(): Devuelve todos los campos de todos los objetos que son obtenidos por la consulta en un arreglo. Si solo se desean ciertos campos, se pueden pasar un arreglo con los nombres de esos campos en especifico.
- first(): Retorna el primer objeto obtenido por la consulta. Se pueden especificar los campos que se desean obtener de ese objeto pasando un arreglo con los nombres como parámetro.
- lists(): Este disparador retorna un arreglo con un solo dato de los resultados encontrados por la consulta, el dato que se desea obtener se debe pasar como parámetro. Opcionalmente se le puede colocar otro dato como clave al arreglo, este seria el segundo parámetro.
- count(): Retorna un entero con la cantidad de datos encontrados en la consulta.
- max(): Recibe como parámetro un campo de la tabla, el cual evalúa para buscar y retornar su máximo valor.
- min(): Recibe como parámetro un campo de la tabla, el cual evalúa para buscar y retornar su mínimo valor.
Modificadores
Veamos la lista de los principales modificadores:
- where(): Se pueden encadenar varios where esto se uniria con AND al utilizar esta función. Recibe tres parámetros ( $primerodato, ‘operador’, $segundodato).
- orWhere(): Funciona igual que el where, pero se unen con OR.
- whereBetween(): Agrega la función BETWEEN al where. Recibe dos parámetros, el campo a comparar y un arreglo con los dos valores del rango.
- whereIn(): Agrega la función IN al where. Recibe dos parámetros, el campo a evaluar y un arreglo con los valores del IN.
- whereNotIn(): Agrega la función IN negada al where. Recibe dos parámetros, el campo a evaluar y un arreglo con los valores del NOT IN.
- whereNull(): Agrega la función IS NULL al where. Recibe como parámetro el campo a verificar.
- orderBy(): Agrega la sentencia ORDER BY a la consulta. Recibe dos parámetros ($campo, $orientacion).
- groupBy(): Agrega la sentencia GROUP BY a la consulta. Recibe como parámetro el campo por el cual se va a agrupar.
- take(): Dependiendo del motor de base dates que utilicemos indica a la misma obtener solo cierta cantidad de regístros de la consulta realizada. Recibe como parámetro la cantidad que se desea obtener.
- skip(): Dependiendo del motor de base dates que utilicemos indica a la misma saltar cierta cantidad de registros. Recibe como parámetros la cantidad que se desea omitir y siempre debe ir acompañada de take().
Veamos unos ejemplos para entender todo esto mas claro. Tengamos en cuenta que se pueden tener tantos modificadores como sea necesario y disparadores debe ser uno solo.
$resultado = DB::table('carros')->get(); $resultado = DB::table('carros')->count(); $resultado = DB::table('carros')->where('color', '=', 'Verde')->get(); $resultado = DB::table('carros')->where('color', '=', 'Verde')->get(array('id', 'modelo', 'color')); $resultado = DB::table('carros')->where('color', '=', 'Verde')->first(); $resultado = DB::table('carros')->where('color', '=', 'Verde')->first(array('id', 'modelo', 'color')); $resultado = DB::table('carros')->where('color', '=', 'Verde')->count(); $resultado = DB::table('carros')->where('color', '=', 'Verde')->max('id'); $resultado = DB::table('carros')->where('color', '=', 'Blanco')->where('modelo','=','Corrolla')->get(); $resultado = DB::table('carros')->where('color', '=', 'Blanco')->orWhere('placa','=','JUH 111')->get(); $resultado = DB::table('carros')->whereBetween('id', array('1', '4'))->get(); $resultado = DB::table('carros')->whereNull('color')->get(); $resultado = DB::table('carros')->orderBy('modelo', 'Desc')->get(); $resultado = DB::table('carros')->groupBy('color')->get(array('color')); $resultado = DB::table('carros')->take(4)->skip(3)->get();1234567891011121314151617181920212223242526272829 $resultado=DB::table('carros')->get(); $resultado=DB::table('carros')->count(); $resultado=DB::table('carros')->where('color','=','Verde')->get(); $resultado=DB::table('carros')->where('color','=','Verde')->get(array('id','modelo','color')); $resultado=DB::table('carros')->where('color','=','Verde')->first(); $resultado=DB::table('carros')->where('color','=','Verde')->first(array('id','modelo','color')); $resultado=DB::table('carros')->where('color','=','Verde')->count(); $resultado=DB::table('carros')->where('color','=','Verde')->max('id'); $resultado=DB::table('carros')->where('color','=','Blanco')->where('modelo','=','Corrolla')->get(); $resultado=DB::table('carros')->where('color','=','Blanco')->orWhere('placa','=','JUH 111')->get(); $resultado=DB::table('carros')->whereBetween('id',array('1','4'))->get(); $resultado=DB::table('carros')->whereNull('color')->get(); $resultado=DB::table('carros')->orderBy('modelo','Desc')->get(); $resultado=DB::table('carros')->groupBy('color')->get(array('color')); $resultado=DB::table('carros')->take(4)->skip(3)->get();
Query Builder y Modelos
Por último debemos saber que todas las consultas que hacemos con el Query Builder las podemos hacer de igual manera con los modelos. El modelo actuaría como el creador de la consulta, ya que cada modelo tiene una tabla asociada.
// Si asumimos que tenemos un modelo llamado Carros, el cual utiliza la tabla carros en la base datos // entonces los dos códigos serian equivalentes. $resultado = DB::table('carros')->where('color', '=', 'Verde')->get(array('id', 'modelo', 'color')); $resultado = Carros::where('color', '=', 'Verde')->get(array('id', 'modelo', 'color'));123456 // Si asumimos que tenemos un modelo llamado Carros, el cual utiliza la tabla carros en la base datos// entonces los dos códigos serian equivalentes. $resultado=DB::table('carros')->where('color','=','Verde')->get(array('id','modelo','color')); $resultado=Carros::where('color','=','Verde')->get(array('id','modelo','color'));
Conclusiones
En este capítulo aprendimos a realizar consultas a la base de datos con SQL puro o con la libreria Query Builder. Ahora queda al gusto y las necesidades de cada quien de que manera buscar la información en la base de datos para desarrollar grandes sistemas. Cualquier duda estare antento a responderla en la sección de comentarios.