simple ABM en CI

877 views
Skip to first unread message

cesar barcia

unread,
Mar 21, 2011, 10:17:57 PM3/21/11
to CodeIgniter-spanish
Hola gente como estan?

ayer comence a ser parte de este grupo de CI.. estoy empezando con
este framework (primero que veo) hice algunas cosas como manejo de
URL, formularios, link etc.. pero con el tema de mysql no le agarro la
mano a los modelos.. pude hacer una query nada mas un SELECT para
recuperar datos eso si pude hacer..

la pregunta es no hay por ahi algun ABM simple echo en CI para ver
como usan los modelos para INSERT, UPDATE y demas?

les agradeceria mucho esta informacion la verdad me encanto CI quiero
aprender realmente.

Suerte gente, gracias de antemano.

Juanmy

unread,
Mar 22, 2011, 6:13:09 AM3/22/11
to codeignit...@googlegroups.com
Hay un MY_Model que suelo utilizar que lo que haces es tener predefinidas algunas de las funciones de interacción con la BD, con lo que luego sólo tienes que extender de él tu propio modelo y ya tienes mucho camino andado.

Este es el código:
<?php
if (!defined('BASEPATH'))
  exit('No direct script access allowed');

class MY_Model extends CI_Model{

  var $table = "";

  function My_Model() {
    parent::Model();
    $this->load->database();
  }

  function insert($data) {
    $this->db->insert($this->table, $data);
    return $this->db->insert_id();
  }

  function find_id($id) {
    if ($id == NULL) {
      return NULL;
    }

    $this->db->where('id', $id);
    $query = $this->db->get($this->table);

    $result = $query->result_array();
    return (count($result) > 0 ? $result[0] : NULL);
  }

  function find_all($sort = 'id', $order = 'asc') {
    $this->db->order_by($sort, $order);
    $query = $this->db->get($this->table);
    return $query->result_array();
  }

  function update($id, $data) {
    $this->db->where('id', $id);
    $this->db->update($this->table, $data);
    return TRUE;
  }

  function delete($id) {
    if ($id != NULL) {
      $this->db->where('id', $id);
      $this->db->delete($this->table);
    }
    return TRUE;
  }

  function buscar($array,$orden='',$limite='1',$tabla='') {
    if ($array == NULL) {
      return NULL;
    }
    if($tabla=='') $tabla= $this->table;

    $this->db->where($array);
    if($orden !='') $this->db->order_by($orden);
    if($limite != ''){
      if(is_array($limite)) {
        $this->db->limit($limite[1], $limite[0]);
      }else{
        $this->db->limit($limite);
      }
    }
    $consulta = $this->db->get($tabla);

    if($consulta->num_rows() > 0){
      return $consulta;
    }else{
      return FALSE;
    }
  }

}

/* End of file MY_Model.php */
/* Location: ./core/MY_Model.php */

Luego en tu propio modelo sólo tienes que poner:
<?php
class mi_modelo extends MY_Model {
  function __construct() {
    parent::__construct();
    $this->table = 'mitabla';
  }
?>

y ya tienes las principales funciones a la bd.

cesar barcia

unread,
Mar 22, 2011, 8:58:46 PM3/22/11
to CodeIgniter-spanish
hola juanmy;
te agadezco mucho el dato lo voy a probar mas tranquilo manana, pero
ya le di una buena mirada y lo vi medio complicado para mi ya qu estoy
empezando.. lo que voy hacer voy a pegar el codigo simple que tengo lo
que puedo hacer asi pido una ayuda mas concreta, agradezco igual toda
info y ayuda..

On 22 mar, 07:13, Juanmy <juanm...@gmail.com> wrote:
> Hay un MY_Model que suelo utilizar que lo que haces es tener
> predefinidas algunas de las funciones de interacci�n con la BD, con lo
> que luego s�lo tienes que extender de �l tu propio modelo y ya tienes
> mucho camino andado.
>
> Este es el c�digo:
> Luego en tu propio modelo s�lo tienes que poner:
> <?php
> class mi_modelo extends MY_Model {
>    function __construct() {
>      parent::__construct();
>      $this->table = 'mitabla';
>    }
> ?>
>
> y ya tienes las principales funciones a la bd.
>
> El 22/03/2011 3:17, cesar barcia escribi�:

Juanmy

unread,
Mar 23, 2011, 4:06:46 AM3/23/11
to codeignit...@googlegroups.com
Ok, de todas formas no es complicado, conforme programes un poquito en CI te darás cuenta que en los modelos siempres vas a utilizar una serie de funciones tipo para el acceso a la bd correspondiente y eso es lo que se consigue de esta forma.

Saludos.

Ariel Mariani

unread,
Mar 23, 2011, 8:51:39 AM3/23/11
to CodeIgniter-spanish
Hola César, mirá, si sabés inglés este videotutorial te va a ayudar
muchísimo como amí: http://net.tutsplus.com/articles/news/codeigniter-from-scratch-day-5-crud/
CRUD: Create, Read, Update and Delete

Y este de David Rojas con scaffolding (viene deshabilitado en las
nuevas versiones de CI pero para aprender no está de más):
http://blip.tv/play/hJIhgbHXdwI

Espero te sirva, saludos!!

Ariel

cesar barcia

unread,
Mar 27, 2011, 5:10:36 PM3/27/11
to CodeIgniter-spanish
Ariel muchas gracias por esos link.. ya le voy a dar una mirada, no se
ingles pero bueno es para darse una idea como hacen las cosas.

Te lo agradezco

On 23 mar, 09:51, Ariel Mariani <ariel....@gmail.com> wrote:
> Hola César, mirá, si sabés inglés este videotutorial te va a ayudar
> muchísimo como amí:http://net.tutsplus.com/articles/news/codeigniter-from-scratch-day-5-...

JavierCane

unread,
Mar 29, 2011, 3:18:26 AM3/29/11
to CodeIgniter-spanish
@Juanmy se agradece esa 'plantilla'!

Aprovechando el tema de gestión CRUD y demás, me gustaría preguntaros
acerca de vuestra opinión sobre ORMs como Datamaper o Doctrine, ya que
estoy pensando en implementarlos y tengo ciertas dudas que si por aquí
hay alguien con experiencia y me las puede resolver, me hace un favor:

- ¿Relamente se ahorra tiempo en el desarrollo? (¿algunos ejemplos
claros?)
- ¿Son compatibles con el manejo de sesiones por BBDD?
- ¿Son compatibles con sistemas de autenticación y gestión de permisos
como Ion Auth?
- ¿No supone ningún problema a la hora de actualizar el core de CI?
- ¿Pros y contras que le véis personalmente desde vuestra experiéncia?

Saludos y muchas gracias!

iMefisto

unread,
Mar 29, 2011, 5:45:59 AM3/29/11
to codeignit...@googlegroups.com
Hola gentes. Sobre el uso de ORMs: estoy utilizando Doctrine en un par de proyectos y tiene sus pro y sus contras. Aquí va mi opinión:

Como varios sabrán, Doctrine define una capa más entre la aplicación y la base de datos, que mapea tablas de la base de datos en objetos, es decir: para cada tabla existirá una clase cuyos métodos permitirán la manipulación de los registros de la tabla, agregando, a la posibilidad de efectuar consultas, otras funcionalidades en cuanto a la forma de manipular los datos.

Tiene una sintáxis propia (DQL) que es bastante fácil de empezar a utilizar y muy buena documentación.

Desde que uno empieza a usar Doctrine no tiene que escribir un insert, o un delete, ni un update ya que éstos se incorporan a los objetos que creamos.

Para mí, la caraterística que más disfruto de Doctrine es la naturalidad con la que se manejan las listas de colecciones retornadas de una consulta. Especialmente si en esa consulta se efectuaron joins.

En un proyecto tuve que usar Doctrine y Ion Auth y no tuve problemas. La primer idea que se me vino en mente fue: en el archivo de configuración en el que Doctrine te permite definir la base de datos incluí las tablas de Ion_auth (de esta manera, cada vez que reconstruía la base de datos, esas tablas estaban incluídas). Y para el manejo de Ion Auth utilicé los models que ésta trae, en este caso las clases que genera Doctrine para las tablas de Ion están en desuso en mi aplicación.

Sobre el uso de sesiones pasa algo similar: como sabemos, en Codeigniter hay que crear una tabla para el manejo de sesiones, por lo tanto, en el archivo de Doctrine que define la base de datos (schema.yml) definí la tabla de las sesiones también.

Sobre la actualización tanto del core de CI como de Doctrine no se presentó ningún problema ya que doctrine se guarda en una carpeta propia, ajena al core, permitiendo que cualquiera de los dos sea actualizado independientemente del otro.

Otro punto a favor es que no hay que hacer loads de cada modelo ya que se puede definir el autoload para las clases de Doctrine y con esto, las clases del modelo estarán disponibles en todo momento.


Algunas contras:

-La versión 2 de Doctrine requiere un PHP bastante nuevo junto con PDO mysql y a veces no está disponible en todos los hostings compartidos, sin embargo la versión 1.2.4 acepta algunas versiones menos.

-Otro tema es el nombre de las clases de Doctrine que no debe ser igual a la de los controladores (es común tener un controlador Cliente y la clase del model deberá tener un nombre distinto y eso a veces complica un poco todo el proceso de diseño). Yo para no enredarme demasiado opté por agregar el "_model". Entonces si tengo un controlador Cliente, posiblemente tenga un modelo Cliente_model. Hay otras soluciones pero requieren codificación extra.

-Como Doctrine retorna una colección de objetos fácilmente iterables uno puede terminar cayendo vilmente en la tentación de pasar esa colección directamente a la vista, en la cual termina habiendo demasiado PHP lo que rompe un poco el patrón de diseño MVC de Codeigniter y luego las vistas son un poco complicadas de leer. Para evitar esto, a veces se requiere efectuar dos iteraciones: una en el controlador, creando el listado simplificado que vamos a pasar a la vista y luego volver a iterar en la vista para mostrar los datos.

-Performance. Punto sensible si los hay. Doctrine agrega una capa extra a la aplicación y esto significa más procesamiento. Aquí hay que evaluar si se acepta este costo a cambio de mayor flexibilidad en el desarrollo. Personalmente no he notado una gran caída de performance por usar doctrine.

Seguramente deben haber más cosas por pensar sobre la librería, éstas son las que yo me topé con las aplicaciones que tuve que hacer.

Entonces..usamos o no usamos Doctrine? a mi me gusta y me resulta muy cómodo. Lo que más peso tiene a la hora de desistir y volver a los models de CI es el hecho de las versiones de PHP. Si uno quiere que su aplicación sea lo más compatible posible, deberá trabajar con los models definidos por uno mismo.
Si conocemos de antemano el destino final de la aplicación, versión de PHP instalada, etc, entonces podremos evaluar la posibilidad de usar Doctrine de antemano.

Disculpen que se me hizo largo el mail. Saludos!



--
---
Para anular la suscripción a este grupo, envía un mensaje a
codeigniter-spa...@googlegroups.com
Para obtener más opciones, visita este grupo en
http://groups.google.com/group/codeigniter-spanish?hl=es.

iñigo medina

unread,
Mar 29, 2011, 6:09:12 AM3/29/11
to codeignit...@googlegroups.com

Muy buen resumen iMefisto.
Gracias. :)

JavierCane

unread,
Mar 29, 2011, 5:27:50 PM3/29/11
to CodeIgniter-spanish
@iMefisto muchísimas gracias por tu tiempo, de verdad que es justo lo
que necesitaba y has aclarado todos los puntos que he planteado, se
agradece enormemente :)

Ahora faltaría la opinión de alguien con experiencia usando
DataMapper, ya que por lo que he visto ( http://codeigniter.com/forums/viewthread/146020
), la diferencia entre Doctrine2 y DataMapper radica en que éste
último está desarrollado más enfocado específicamente a Codeigniter y
es más liviano (a causa de tener menos características).

Carlos Mora

unread,
Apr 5, 2011, 7:07:33 AM4/5/11
to codeignit...@googlegroups.com
El día 29 de marzo de 2011 11:45, iMefisto <imef...@gmail.com> escribió:
> Hola gentes. Sobre el uso de ORMs: estoy utilizando Doctrine en un par de
> proyectos y tiene sus pro y sus contras. Aquí va mi opinión:

Gracias por el resumen, es bueno escuchar a quienes han hecho
experiencia. Una pregunta ¿Lo usas con CI2? Encontré un tutorial sobre
Doctrine + CI, pero lo hace via plugins, lo que seria inutil en CI2.

Un saludo

iMefisto

unread,
Apr 5, 2011, 11:00:22 AM4/5/11
to codeignit...@googlegroups.com
Carlos:

Aún no lo usé con CI2. Vi ese tutorial donde se usa con plugin (me refiero a 'CodeIgniter and Doctrine from scratch'), pero yo los estoy integrando según la manera descripta en la misma web de doctrine:

http://www.doctrine-project.org/projects/orm/1.2/docs/cookbook/code-igniter-and-doctrine/en

(estoy usando Doctrine 1.2 porque los proyectos en donde lo instalé, están con hostings que no cumplen con los requerimientos para Doctrine 2, cosa que adoro de CI)


Me gustó esa solución porque requiere modificar pocos archivos de CI (database.php e index.php), el resto es agregar algunas carpetas.

Alguien podrá decir que no es buena técnica porque requiere modificar el index.php (se agregan 2 líneas al final) pero me resultó menos intrusiva y fácil de limpiar en caso de cambiar de idea durante el proyecto (esto me suele pasar por culpa de los hostings q no tienen php actualizado y mía por no chequear esto antes de empezar :P).

No sé cómo quedará ahora con CI2 pero supongo que no debería haber problemas porque no tuve que tocar nada referido a plugins en CI 1.7

Apenas tenga un respiro haré la prueba. Si alguien se adelanta, mejor.

Saludos.




--

master

unread,
Apr 5, 2011, 1:40:33 PM4/5/11
to codeignit...@googlegroups.com

mira en la carpeta file de este proyecto

https://github.com/EstebanFuentealba/PHPCodeCreator

tengo ci 2.0 + doctrine 1.2 integrados.

en el archivo database se integran

----- Mensaje original -----
De: "Carlos Mora" <carlosan...@gmail.com>
Para: codeignit...@googlegroups.com
Enviados: Martes, 5 de Abril 2011 8:07:33
Asunto: Re: [codeigniter-spanish] Re: simple ABM en CI

Un saludo

--

Carlos Mora

unread,
Apr 6, 2011, 4:41:05 AM4/6/11
to codeignit...@googlegroups.com
Master,

> https://github.com/EstebanFuentealba/PHPCodeCreator
>
> tengo ci 2.0 + doctrine 1.2 integrados.
>
> en el archivo database se integran

Había leído el post donde comentabas lo del CodeCreator y lo tengo
como tarea para el finde ;) asi es que seguro estaremos curioseando.
Aún no he visto nada, pero me gustaría saber tus razones para no usar
Doctrine 2.0.

Un saludo

Carlos Mora

unread,
Apr 6, 2011, 4:52:58 AM4/6/11
to codeignit...@googlegroups.com
iMefisto,

> http://www.doctrine-project.org/projects/orm/1.2/docs/cookbook/code-igniter-and-doctrine/en


> Me gustó esa solución porque requiere modificar pocos archivos de CI
> (database.php e index.php), el resto es agregar algunas carpetas.

Personalmente valoro mucho las soluciones poco intrusivas, que me
permitan actualizar CI sin tener impactos significativos. Gracias por
la referencia, el finde lo voy a ver, a ver que tal me va. Seguramente
estaré dando la brasa con alguna cuestión. Puestos a experimentar, voy
a probar a usarlo con CI2 a ver que tal, el amigo 'master' lo usa en
su generador de codigo.

Un saludo

master

unread,
Apr 6, 2011, 10:44:35 AM4/6/11
to codeignit...@googlegroups.com
principalmente por que seria mezclar php 5.2 (Codeigniter) con php 5.3 (doctrine 2.0)

solo por eso si usara solo php 5.3 usaria doctrine 2.0

----- Mensaje original -----
De: "Carlos Mora" <carlosan...@gmail.com>
Para: codeignit...@googlegroups.com

Enviados: Miércoles, 6 de Abril 2011 4:41:05


Asunto: Re: [codeigniter-spanish] Re: simple ABM en CI

Master,

Un saludo

--

Juanmy

unread,
Apr 7, 2011, 4:15:54 AM4/7/11
to codeignit...@googlegroups.com
He encontrado este enlace (miento me ha llegado por twitter) http://wildlyinaccurate.com/integrating-doctrine-2-with-codeigniter-2/ creo que es interesante.

Eduardo Passarelli

unread,
Jul 2, 2011, 2:18:48 PM7/2/11
to codeignit...@googlegroups.com
Buenas, tratando de usar el MY_Model que puso Juanmy me tiraba el siguiente error y no me dejaba usarla

Fatal error: Call to undefined method CI_Model::Model()

Googleando encontre que el problema era que ahora con CI 2 es distinta  la manera de llamar al constructor no es llamando a un metodo igual que la clase, si no llamando al metodo:

Antes:
   function My_Model() { 
     parent::Model();
     $this->load->database(); 
   }

Ahora seria:
   function My_Model() { 
parent::__construct();
   $this->load->database(); 
   }

Comento esto solo por si a alguien le paso lo mismo.
Saludos
Reply all
Reply to author
Forward
0 new messages