2. CodeIgniter: modelos

Primera aproximación a los modelos y las consultas en CodeIgniter

basquiat

archivado en: PHP/AJAX / 26 mayo, 2013 / taller:

Seguimos con el tutorial de CodeIgniter. En esta entrada veremos cómo trabajar con la base de datos mediante los modelos, pero antes vamos a conocer una manera de enviar datos desde el controlador a la vista.

Cuando un controlador carga una vista, podemos enviarle un array con los datos que vayamos a necesitar. Por convención se suele llamar $data. Por ejemplo, con este controlador (paises.php) le enviamos a la vista (v_paises.php) el titular de la página...

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Paises extends CI_Controller {

public function portada()

{

$data['titular'] = "Países del mundo";

$this->load->view('v_paises', $data);

}

}

/* End of file paises.php */

/* Location: ./application/controllers/paises.php */

Luego, en la vista, ni siquiera tenemos que pasar por el array, sino que podemos acceder directamente al dato como si fuera una variable normal.

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="utf-8">

<title>Hola Mundo</title>

</head>

<body>

<div id="wrap">

<h1><?= $titular ?> </h1>

</div>

</body>

</html>

Nota: atajos gramaticales

Quizás alguien se haya sorprendido por la línea del código anterior, en el que en vez de utilizar un echo he utilizado el signo = con la declaración de apertura de PHP. Como veremos en detalle más adelante, CodeIgniter tiene ciertas variantes gramaticales que a veces facilitan el trabajo. La que me parece más interesante es esta:

<?= $nombre_variable ?>

que equivale a un echo de toda la vida.

<?php echo $nombre_variable ?>

database.php

Bueno, pues ahora que ya sabemos cómo enviar datos desde el controlador a la vista, vamos a preparar un ejemplo en el que se cargue una tabla con todos los países que hay en la tabla country de la base de datos world de Oracle; pero antes tenemos que decirle a CodeIgniter qué base de datos debe utilizar y cuál es su contraseña, su usuario, etcétera.

Las especificaciones de la base de datos se indican en el archivo application/config/database.php y se explican por sí solas.

$active_group = 'default';

$active_record = TRUE;

$db['default']['hostname'] = 'localhost';

$db['default']['username'] = 'root';

$db['default']['password'] = '';

$db['default']['database'] = 'world_innodb';

$db['default']['dbdriver'] = 'mysql';

$db['default']['dbprefix'] = '';

$db['default']['pconnect'] = TRUE;

$db['default']['db_debug'] = TRUE;

$db['default']['cache_on'] = FALSE;

$db['default']['cachedir'] = '';

$db['default']['char_set'] = 'utf8';

$db['default']['dbcollat'] = 'utf8_general_ci';

$db['default']['swap_pre'] = '';

$db['default']['autoinit'] = TRUE;

$db['default']['stricton'] = FALSE;

De momento, solo nos interesan estos parámetros:

  • $db['default']['hostname'] = 'localhost'; <--- URL
  • $db['default']['username'] = 'root'; <--- Usuario
  • $db['default']['password'] = ''; <--- Contraseña
  • $db['default']['database'] = 'world_innodb'; <--- base de datos

autoload.php

A diferencia de otros frameworks e incluso de algunos CMS tan bien diseñados como WordPress, CodeIgniter permite especificar en todo momento lo que debe cargarse, lo cual hace que sea muy ligero. Sin embargo, en ocasiones nos puede interesar que determinada funcionalidad esté siempre presente, sobre todo si la vamos a utilizar una y otra vez, ya que así nos ahorramos indicar en cada controlador que se incluya.

Así, por ejemplo, si una web tiene muchas conexiones a la base de datos, como ocurre por ejemplo con los blogs, las revistas digitales o los foros, conviene indicar que se cargue siempre la librería que gestiona la bbdd. Para eso abrimos el archivo application/config/autoload.php y en $autoload['libraries'] indicamos que cargue la librería database:

$autoload['libraries'] = array('database');

Bueno, pues con esto ya lo tenemos todo listo para empezar a lanzar queries como locos :P.

Una primera consulta

Para la siguiente práctica vamos a preparar tres archivos:

  1. El controlador: application/controllers/paises.php
  2. La vista: application/views/v_paises.php
  3. El modelo: application/models/m_paises.php

En el controlador añadimos un constructor, donde indicamos qué modelo debe incluirse. Y en la función que carga la vista almacenamos el resultado de la consulta en el array que enviamos.

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Paises extends CI_Controller {

function __construct()

{

parent::__construct();

$this->load->model('m_paises');

}

public function portada()

{

$data['titular'] = "Países del mundo";

$data['paises'] = $this->m_paises->select_paises();

$this->load->view('v_paises', $data);

}

}

/* End of file paises.php */

/* Location: ./application/controllers/paises.php */

Como veremos luego con detalle, en el modelo realizamos la consulta y la devolvemos en un array (que es recogido en el controlador).

<?php

class M_paises extends CI_Model {

function select_paises()

{

$query = $this->db->get('country');

if($query->num_rows() > 0)

{

foreach ($query->result() as $fila)

{

$data[] = $fila;

}

return $data;

}

else

{

return FALSE;

}

}

}

Y ya solo hay que recorrer el array en la vista con un foreach.

<body>

<div id="wrap">

<h1><?= $titular; ?></h1>

</div>

<table>

<?php foreach ($paises as $pais) { ?>

<tr><td><?= $pais->Name; ?></td></tr>

<?php } ?>

<table>

</body>

Queries

Ahora que conocemos el mecanismo básico, podemos profundizar en la manera en que se lanzan las queries, que en esencia puede ser de dos formas.

Una es de la manera tradicional, escribiendo la query como siempre:

 $query = $this->db->query('SELECT Name FROM country');

Creo que esta es la manera más cómoda para lanzar las consultas cuando son enrevesadas, de esas que vas joineando tablas a diestro y siniestro, pero cuando son normales quizás sea más rápido emplear los atajos que nos proporciona la clase Active Records de CodeIgniter. Está bien explicada en el manual, por lo que me limitaré a exponer un par de ejemplos.

1. SELECT

La consulta más sencilla, un SELECT *, se puede realizar mediante el método get():

$query = $this->db->get('country');

Para seleccionar unas columnas en concreto se utiliza el método select():

$this->db->select('Name');

$this->db->select('title, content, date');

2. WHERE

Hay varias maneras de incluir una cláusula WHERE. La más sencilla es mediante el método where() indicando en los parámetros un par clave/valor, donde la clave es el nombre de la columna.

$this->db->where('Name','Aruba'); 

Para concatenar varias condiciones (AND) se pueden ir agregando las llamadas al método where():

$this->db->where('Continent','North America');

$this->db->where('Region','Caribbean');

Otra manera de incluir una cláusula where es utilizando un array asociativo:

$this->db->select('Name');

$this->db->where(array('Name'=>'Aruba'));

$query = $this->db->get('country');

Aún hay otra forma más, que es utilizando el método get_where() en vez de get():

$query = $this->db->get_where('country', array('Name' => 'Aruba'));

Y si ninguna de las anteriores nos convence, siempre podemos emplear una sentencia normal de SQL, en cuyo caso hay que indicarle mediante NULL y FALSE en los parámetros que no escape las comillas para que no dé error.

$where = "Continent='North America' AND Region='Caribbean'";

$this->db->where($where, NULL, FALSE);

Bueno, de momento vamos a dejarlo aquí y ya en la próxima entrada sigo explicando más cosas de los modelos.

|| Tags: , ,

valoración de los lectores sobre 2. CodeIgniter: modelos

  • estrellica valoración positiva
  • estrellica valoración positiva
  • estrellica valoración positiva
  • estrellica valoración positiva
  • estrellica valoración negativa
  • 3.6 sobre 5 (7 votos)

¿Te ha parecido útil o interesante esta entrada?
dormido, valoración 1 nadapensativo, valoración 2 un poco sonrisa, valoración 3 a medias guiño, valoración 4 bastante aplauso, valoración 5 mucho

Tú opinión es muy importante, gracias por compartirla!

2 respuestas a “2. CodeIgniter: modelos