2012-01-12 10 views
6

Me gusta mucho el registro activo de CodeIgniter y lo bien que permite todas las consultas de bases de datos que necesito.¿Qué significa Doctrine Add Above Active Record - CodeIgniter?

Pero también he estado leyendo sobre ORM como Doctrine. Cuando leo la documentación de Doctrine, no parece tan claro usarla como Active Record, y no puedo ver qué lo hace mejor (si es que lo es).

¿Qué permite Doctrine que no sea posible con Active Record? ¿Doctrine hace el mismo trabajo más rápido, más fácil, mejor? ¿O hace cosas que Active Record no puede hacer?

Lo mejor sería que las personas pudieran publicar ejemplos de tareas que muestren de lo que estamos hablando.

Gracias, Mateo

+0

Doctrine es un ORM completo que implementa el patrón de registro activo. La clase de registro activo de CodeIgniter es más un generador de consultas basado en una versión "modificada" del patrón. – birderic

+0

Hi birderic, Gracias por la respuesta rápida. ¿Puedes darme un ejemplo en el que esto entraría en juego? ¿Estamos hablando de cosas como las operaciones CRUD? – MatthewSchenker

+0

Escribiré una respuesta más larga. No tengo experiencia con Doctrine, pero haré todo lo posible para comparar los dos. – birderic

Respuesta

9

doctrina es un ORM en toda regla que implementa el patrón de registro activo. La clase de registro activo de CodeIgniter es un contenedor de compilador/base de datos de consulta que se basa en una versión "modificada" del patrón.

Descargo de responsabilidad: Nunca he usado Doctrine. Haré todo lo posible para ilustrar las diferencias entre la implementación del registro activo de CodeIgniter y Doctrine, según lo que entiendo.

Usando la clase registro activo de CodeIgniter, que podría poner en práctica un modelo como este:

class User_model extends CI_Model 
{ 

    public function get_user_by_username($username) 
    { 
     // Build query using active record methods 
     $this->db->where('username', $username); 
     $this->db->where('active', 1); 

     // Execute query 
     $query = $this->db->get('users'); 

     // Return results 
     return $query->result(); 
    } 

    // ... 

} 

Usted es básicamente la construcción de la consulta utilizando los métodos de registro activos. Es fácil ver cómo cada método (where(), get(), etc.) se asigna a SQL sin procesar. La ventaja de utilizar los métodos de registro activo en lugar de simplemente $this->db->query() es que CodeIgniter compila cada consulta en función del controlador de la base de datos que está utilizando. Aparte de eso, la implementación del registro activo de CodeIgniter realmente no hace mucho. Cualquier consulta que necesites, necesitarás crear. Espero haber ilustrado cómo los métodos de registro activo son similares a un generador de consultas.

Tenga en cuenta que el siguiente código de ejemplo puede ser incorrecto. El uso de Doctrina, que podría tener un modelo como este:

/** @Entity */ 
class User 
{ 

    /** @Column(type="integer") */ 
    private $id; 

    /** @Column(length=50) */ 
    private $username; 

    // ... 

} 

entonces para usar el modelo y la funcionalidad de registro activo asociado, que haría algo como esto:

// Instantiate object 
$user = new User(); 

// Set properties 
$user->username = 'some_username'; 

// Save object 
$user->save(); 

// Access properties 
echo $user->id; 

Esto es sólo arañando la superficie en términos de lo que Doctrine puede hacer. Puede establecer valores predeterminados para propiedades o especificar relaciones entre tablas. Observe cómo no escribí ningún SQL o compilación de la consulta. Acabo de establecer las propiedades del objeto y luego lo guardé. Doctrine se ocupa del resto.

Tenga en cuenta que Doctrine incluye su propio generador de consultas, de modo que hace lo que hace el registro activo de CodeIgniter, y más.

El uso de Doctrine es similar a la implementación de CakePHP o Ruby on Rails del patrón de registro activo. Podrías echar un vistazo allí para obtener información adicional sobre el patrón. Los ejemplos de CakePHP pueden ser particularmente fáciles de digerir si proviene de un fondo de CodeIgniter.

Para responder algunas de sus otras preguntas, no creo que haya nada que haga que Doctrine sea mejor que los métodos de registro activo de CodeIgniter. Puede ser más avanzado, pero como cualquier otra biblioteca, desea elegir la mejor herramienta para el trabajo.Si está satisfecho con los métodos de registro activo de CodeIgniter y no ve la necesidad de un ORM avanzado, omítelo.

+1

birderic, gracias amablemente por esta respuesta. Me ayuda a ver lo que estaba buscando. También he estado estudiando la clase de base de datos de Symfony, y parece más como los métodos de CakePHP. Me alegra saber que ambos métodos pueden lograr los mismos objetivos generales, aunque lleguen de manera diferente. – MatthewSchenker

+0

Doctrine 2.x no usa registro activo. Utiliza el patrón del mapeador de datos. –

18

En primer lugar, ¿de qué Doctrina estás hablando, 1 o 2?
Hay una gran diferencia. Lo único que los dos tienen en común es que ambos son ORM-s de pleno derecho. De lo contrario, realmente no hay ninguna conexión entre los dos.

Doctrina 1 se basa en ActiveRecords, Doctrina 2 se basa en asignador de datos patrón.
Ambos pueden hacer las mismas cosas, pero hay algunas diferencias significativas entre los dos.

En general, el correlacionador de datos es menos "amigable para el desarrollador" pero debería tener un mejor rendimiento. ¿Por qué? En realidad, es bastante simple. Con los registros activos, cada entidad sabe todo "alrededor" de sí misma, su relación con otras entidades, etc. Con el mapeador de datos, las entidades son tontas y livianas, existe una entidad central (EntityManager/UnitOfWork en Doctrine2) que maneja todo el mapeo de relaciones. Entonces, en términos de uso de memoria y rendimiento, el mapeador de datos debe ser más rápido.
Los tipos de Doctrine dicen que Doctrine2 es al menos un 50% más rápido que Doctrine1 (también existen otras diferencias, no solo el patrón de diseño).

Si lo deseas, incluso puedes implementar ActiveRecords sobre el mapeador de datos Doctrine2. Mira esto blog post. Estoy usando este enfoque solo para la fase de desarrollo, para mantener el menor código posible. Una vez que entra en producción, mataré la capa ActiveRecords adicional y la retrotraeré al mapeador de datos predeterminado de Doctrine2.

Así que la conclusión es que puede hacer todo con ambos, pero de la misma manera podría decir que puede hacer todo con SQL sin procesar. Si eres un principiante en el mundo de ORM, te sugiero ir con ActiveRecords, porque es simple y (por lo general) requiere menos código. Por otro lado, si está construyendo un modelo grande y complejo, creo que el mapeador de datos es la mejor opción.

Tal vez tengo algo mal, pero así es como lo entendí.

En cuanto a la comparación entre CodeIgniters ActiveRecords y Doctrine (1 o 2), no puedo decirlo porque nunca utilicé CodeIgniter. Una cosa de la que estoy seguro es que Doctrine tiene muchas más características que el ORM predeterminado de CodeIgniters. Por ejemplo: hidratación del resultado, herencia (tabla única, tabla de clases), recuperación previa, carga diferida, carga adicional diferida, extensiones, comportamientos, optimización, proxies, manejo de fecha y hora ... Es un ORM masivo y completo con una gran cantidad de características, mientras que mi experiencia con cualquier "ORM marco predeterminado" es que su objetivo principal es ser lo más simple posible, por lo que un novato puede entenderlo muy fácilmente. Doctrine es una bestia poderosa, y de seguro puede hacer muchas cosas de una manera más eficiente y/o lógicamente más correcta que la construida en CodeIgniter ORM. La desventaja es que se necesita más tiempo para aprender y codificar, y es una gran biblioteca, con miles de archivos, de modo que solo para que todo funcione se agrega algo de gastos generales en comparación con una alternativa más ligera.

+0

ZolaKt, gracias por su respuesta. Estoy hablando de las últimas versiones de todo. Me gustan las características adicionales que describes para Doctrine. Generalmente, realmente me gusta CodeIgniter, pero soy nuevo en frameworks en general. Parece que mi mejor enfoque sería dominar la clase Active Record de CodeIgniter, luego buscar usar Doctrine dentro de CodeIgniter en un momento posterior. – MatthewSchenker

+0

Esto es puramente subjetivo, pero si está planeando aprender un marco, eche un vistazo a Kohana. Es por diseño un poco más flexible con la integración de otras bibliotecas que CodeIgniter. Las últimas versiones están bien, pero como dije, son 2 proyectos completamente diferentes, en dos patrones diferentes. Si está haciendo un proyecto "más pequeño" con los registros activos predeterminados ORM. Pueden hacer casi todo lo que Doctrine puede, aunque algunas cosas tienen que hacerse manualmente. Una cosa que noté, muy raramente esos ORMs apoyan la herencia, así que si lo necesitas, encuentra algo que pueda hacerlo, como Doctrine. – ZolaKt

+0

Otro consejo. Lea y pruebe antes de decidir cuál usar. No se limite a CodeIgniters ORM, hay algunos buenos ORM de registros activos de PHP. Es todo sobre el patrón. Si conoce un ORM de registros activos, sabrá el otro en muy poco tiempo. Lo mismo ocurre con el mapeador de datos. Por ejemplo, si conoce Doctrine, sabrá (N) Hibernate. Si decide que prefiere los registros activos sobre el correlacionador de datos, también puede consultar Propel. Un ORM completo basado en registros activos. De lo que he visto es la única alternativa de PHP a Doctrine si quieres todas las características "sofisticadas" – ZolaKt

Cuestiones relacionadas