php - secret - ¿Cuál es su experiencia con Doctrine ORM?
twitter search api (11)
No soy un experto con Doctrine, solo comencé a usarlo y tengo que admitir que es una experiencia un tanto confusa. Hace mucho por ti, pero no siempre es obvio de inmediato cómo decirle que haga esto o aquello.
Por ejemplo, al tratar de usar archivos YAML con el descubrimiento automático de relaciones, la relación muchos a muchos no se tradujo correctamente en la definición del modelo php. No hay errores como usted menciona, porque simplemente no lo trató como muchos para muchos.
Yo diría que probablemente necesites tiempo para entender esta o aquella manera de hacer las cosas y cómo los elementos interactúan juntos. Y tener tiempo para hacer las cosas paso a paso sería algo bueno y tratar los problemas uno a la vez en una especie de aislamiento. Intentar hacer demasiado a la vez puede ser abrumador y puede hacer que sea más difícil encontrar el lugar donde algo está yendo mal.
¿Cuál es tu experiencia con la doctrina ? Nunca he sido un tipo de tipo ORM, en su mayoría me administraba con solo una capa básica de abstracción db como adodb.
Pero entendí todos los conceptos y beneficios de eso. Entonces, cuando surgió un proyecto que necesitaba un ORM, pensé en probar uno de los framework ORM.
Debo decidir entre doctrina e impulso, así que elijo doctrina porque no quería manejar el requisito de phing.
No sé lo que hice mal. Entré con la mentalidad correcta. Y de ninguna manera soy un niño php ''junior''. Pero he estado luchando contra el sistema en cada paso del camino. Hay mucha documentación pero todo se siente un poco desorganizado. Y cosas simples como la creación de tablas de YAML a db simplemente no funcionarían y simplemente funcionarían sin ningún error ni nada. Una gran cantidad de otras cosas funciona un poco funky requieren solo un poco más de ajuste antes de trabajar.
Tal vez hice una suposición de novato estúpido de aquí que una vez que descubrí lo que es, tendré el momento. Pero ahora estoy totalmente odiando el sistema.
¿Hay alguna sugerencia que alguien pueda darme o tal vez apuntarme a un buen recurso sobre el tema o algún sitio / persona autorizado sobre esto? ¿O tal vez simplemente recomendar otro marco ORM que ''simplemente funciona''?
Estoy usando Doctrine en un proyecto de tamaño mediano donde tuve que trabajar desde bases de datos preexistentes que no son de mi propiedad. Le da muchas características integradas, pero tengo una gran queja.
Como tuve que generar mis modelos a partir de las bases de datos y no al revés, mis modelos están demasiado cerca de la base de datos: los campos tienen nombres muy similares a las columnas de la base de datos, para obtener objetos que debe consultar en lo que es esencial sql (donde ¿Pongo ese código y cómo lo pruebo?), etc.
Al final tuve que escribir un envoltorio complejo para la doctrina que me hace cuestionar si no hubiera sido más fácil simplemente usar el viejo enfoque dao / modelo y dejar la doctrina fuera de la imagen. El jurado aún está deliberando sobre eso. ¡Buena suerte!
Mis experiencias son similares a las tuyas. Recién comencé a usar doctrina y nunca he usado Propel. Sin embargo, estoy muy decepcionado con Doctrine. Su documentación es terrible. Mal organizado, y bastante incompleto.
Tengo sentimientos encontrados Soy un maestro en SQL solo porque es muy fácil de verificar. Puede probar las instrucciones SELECT rápidamente hasta que obtenga los resultados correctos. Y refactorizar es muy fácil.
En Doctorine, o cualquier ORM, hay tantas capas de abstracción que casi parece TOC (obsesivo / compulsivo). En mi último proyecto, en el que probé Doctrine, golpeé varias paredes. Me tomó varios días encontrar una solución para algo que sabía que podría haber escrito en SQL en cuestión de minutos. Eso es muy frustrante.
Estoy siendo gruñón. La comunidad para SQL es ENORME. La comunidad / soporte para Doctrine es minúsculo. Claro que podrías mirar la fuente y tratar de resolverlo ... y esos son los problemas que tardan días en resolverse.
En pocas palabras: no pruebe Doctrine, o cualquier ORM, sin planear mucho tiempo para hacer gimnasia por su cuenta.
Propel and Doctrine usa PDO. PDO tiene muchos errores abiertos con Oracle Database. Todos ellos relacionados con los campos CLOB. Tenga esto en cuenta antes de comenzar un nuevo proyecto si está trabajando con Oracle. Los errores están abiertos desde hace años. Doctrine y PDO colapsarán trabajando con Oracle y CLOB
Después de algunas investigaciones sobre las diversas bibliotecas ORM para PHP, decidí utilizar PHP ActiveRecord. Mi decisión se redujo a la configuración de poco o nada, la naturaleza liviana de la biblioteca y la falta de generación de código. La doctrina es simplemente demasiado poderosa para lo que necesito; lo que PHP ActiveRecord no hace puedo implementar en mi capa de envoltura. Sugiero tomar un momento y examinar cuáles son sus requisitos en un ORM y ver si un simple como PHP ActiveRecord ofrece lo que necesita o si una implementación de registro activo rodada en el hogar sería mejor.
hemos estado utilizando Propel con Symfony durante 2 años y Doctrine con Symfony durante más de 1 año. Puedo decir que cambiar a ORM con framework MVC fue el mejor paso que hemos dado. Recomendaría seguir con Doctrine, aunque toma algo de tiempo aprender a trabajar con él. Al final, encontrará que su código es más legible y flexible.
Si está buscando un lugar donde comenzar, le recomiendo el tutorial de Symfony Jobeet http://www.symfony-project.org/jobeet/1_4/Doctrine/en/ (los capítulos 3, 6 cubren los conceptos básicos) y, por supuesto, Documentación de Doctrine
Como escribí anteriormente, hemos estado usando Doctrine desde hace un tiempo. Para hacer que nuestro trabajo sea más cómodo, desarrollamos una herramienta llamada ORM Designer (www.orm-designer.com) donde se puede definir el modelo DB en una interfaz gráfica de usuario (no más archivos YAML :-), que no son tan malos en absoluto ) Puede encontrar también algunos tutoriales útiles.
Creo que mtbikemike lo resume perfectamente: "Me tomó varios días encontrar una solución para algo que sabía que podría haber escrito en SQL en cuestión de minutos". Esa también fue mi experiencia. SAD (Slow Application Development) está garantizado. Sin mencionar el código feo y las limitaciones en cada esquina. Las cosas que deberían tomar minutos llevan días y las cosas que normalmente serían más complicadas y tardarían horas o días simplemente no son factibles (o no valen la pena el tiempo). El código resultante es mucho más detallado y críptico (porque realmente necesitamos otro lenguaje de consulta, DQL, para que las cosas sean aún menos legibles). Hay bichos extraños por todas partes y la mayor parte del tiempo los dedica a buscarlos y a encontrar limitaciones y problemas. Doctrine (solo utilicé v2.x) es similar a un ejercicio inútil y no tiene absolutamente ningún beneficio. Es, con mucho, el componente más odiado de mi sistema actual y realmente el único con grandes problemas. Al entrar en un nuevo sistema, siempre voy y vienen del db a las clases de entidad tratando de averiguar qué nombre es el correcto en diferentes lugares del código. Una pesadilla total.
No veo un solo profesional en Doctrine, solo contras. No sé por qué existe, y todos los días desearía que no lo hiciera (al menos en mis proyectos).
Usando Doctrine 2.5 en 2015. Al parecer, iba bien. Hasta que quise usar dos entidades (en un JOIN). [es mejor ahora que me he acostumbrado a DQL]
Bueno:
- generando SQL para mí
- uso de claves externas e integridad referencial
- Generación de InnoDB por defecto
- actualizaciones realizadas en SQL con la herramienta de línea de comandos doctrine
Bueno:
- ser hiperconsciente de nombres y mapeo y cómo nombrar y cómo asignar entidades a tablas reales
El malo
- lleva mucho tiempo - aprender API personalizada del generador de consultas. O descubriendo cómo hacer un simple ENTRAR, preguntándose si hay mejores técnicas disponibles. Las UNIONES simples parecen requerir la escritura de funciones personalizadas si desea realizar consultas orientadas a objetos.
- [actualización en la primera impresión anterior] - elegí usar DQL ya que es más similar a SQL
Me parece que la herramienta es genial en concepto, pero su ejecución correcta desea gran parte del tiempo del desarrollador para incorporarse. Estoy tentado de usarlo para la generación de SQL de entidad, pero luego uso PDO para Entrada / Salida real. Solo porque aún no aprendí cómo hacer Foreign Key e Integridad referencial con SQL. Pero aprender eso parece ser una tarea mucho más fácil que aprender complementos de Doctrine incluso con cosas simples como una entidad equivalente a un JOIN.
Doctrina en Proyectos Existentes
Yo (recién estoy empezando) uso Doctrine para desarrollar nuevas funciones en un proyecto existente. Entonces, en lugar de agregar una nueva tabla mysql para la característica, he agregado entidades (que crearon las tablas para mí usando la generación de esquema de Doctrine). Me reservo el uso de Doctrine para las tablas existentes hasta que llegue a conocerlo mejor.
Si tuviera que usarlo en las tablas existentes, primero ... limpiar las tablas, lo que incluye:
- agregando una columna de identificación que es una clave primaria / sustituta
- usando InnoDb / mesa con capacidad de transacción
- asignarlo apropiadamente a una entidad
- ejecutar la herramienta de validación de Doctrine (
doctrine orm:validate-schema
)
Esto se debe a que Doctrine hace ciertas suposiciones sobre sus tablas. Y porque básicamente vas a manejar tus tablas por código. Por lo tanto, su código y sus tablas deben estar en la mayor cantidad posible de acuerdo 1: 1. Como tal, Doctrine no es adecuado para cualquier tabla de "forma libre" en general.
Pero luego, es posible que, con cierto cuidado y, en algunos casos, se salga con pequeñas cosas como que no se contabilicen columnas adicionales en sus entidades (no creo que Doctrine revise a menos que se lo pida). Tendrás que construir tus consultas sabiendo con qué te estás escapando. es decir, cuando solicita una "entidad" como un todo, Doctrine solicita todos los campos de la entidad específicamente por nombre de columna. Si su esquema actual contiene más nombres de columna, no creo que le importe a Doctrine (no lo hace, como he verificado al crear una columna adicional en mi esquema).
Entonces, sí, es posible usar Doctrine pero comenzaría pequeño y con cuidado. Lo más probable es que tenga que convertir sus tablas para admitir transacciones y tener el índice sustituto (clave principal), para empezar. Para cosas como Foreign Keys y Referential Integrity, tendrás que trabajar con Doctrine para pulir tus entidades y unirlas perfectamente. Es posible que deba dejar que Doctrine reconstruya su esquema para usar sus propios nombres de índice para que pueda usar FK y RI correctamente. En esencia, cede el control de sus tablas a Doctrine, por lo que creo que debe conocer el esquema a su manera (como poder usar sus propios nombres de índice, etc.).
Usar Doctrine ORM en 2016 con una experiencia Aprox ~ 2 - 2.5 años.
Inconsistencia intrínseca
SELECT i, p
FROM /Entity/Item i
JOIN i.product p
WHERE ...
Supongamos que las entidades son Item
y Product
. Se conectan a través de Item.product_id
a Product.id
y Product
contiene Product.model
que queremos mostrar junto con Item
.
Aquí se recupera el mismo "producto.modelo" de la base de datos, usando el SQL anterior pero variando los parámetros de SQL:
//SELECT i, p
$ret[0]->getProduct()->getModel();
//SELECT i as item, p as product
$ret[0][''item'']->getProduct()->getModel();
//SELECT i as item, p.model as model
$ret[0][''model''];
El punto que estoy haciendo es esto:
La estructura Output ResultSet puede cambiar drásticamente dependiendo de cómo escriba su instrucción DQL / ORM SELECT .
Desde una matriz de objetos hasta una matriz de matriz asociativa de objetos, pasando por una matriz de matriz asociativa, dependiendo de cómo desee SELECT
. Imagine que tiene que hacer un cambio en su SQL, luego imagine tener que volver a su código y volver a hacer todo el código asociado con la lectura de los datos del conjunto de resultados. ¡Ay! ¡Ay! ¡Ay! Incluso si se trata de unas pocas líneas de código, depende de la estructura del conjunto de resultados, no existe un estándar común de desacoplamiento completo.
¿Qué Doctrina es bueno en
En cierto modo, elimina el manejo de SQL, creando y manteniendo sus propias tablas. No es perfecto A veces falla y debe dirigirse a la línea de comando de MySQL y escribir SQL para ajustar las cosas hasta el punto donde Doctrine y usted están contentos, donde Doctrine ve los tipos de columnas como válidos y hasta donde está satisfecho con los tipos de columnas. No tiene que definir sus propias claves o índices foráneos, está hecho para usted automáticamente.
Qué Doctrina es malo en
Siempre que necesite traducir cualquier SQL significativamente avanzado a DQL / ORM, puede tener dificultades. Aparte de eso, también puede lidiar con inconsistencias como la anterior.
Pensamientos finales
Me encanta Doctrine para crear / modificar tablas para mí y para convertir datos de tabla en Objetos, y volver a conservarlos, y para usar declaraciones preparadas y otros controles y equilibrios, lo que hace que mis datos sean más seguros.
Me encanta la sensación de que Doctrine se ocupa de la conservación persistente desde la interfaz orientada a objetos de PHP. Tengo la sensación de que puedo pensar en mis datos como parte de mi código, y ORM se encarga de las cosas sucias de interactuar con la base de datos. La base de datos se parece más a una variable local y he ganado una apreciación de que si cuidas tus datos, te amará de nuevo.
Odio Doctrine por sus incoherencias y su dura curva de aprendizaje, y tengo que buscar la sintaxis patentada para DQL cuando sé cómo escribir cosas en SQL. El conocimiento de SQL está disponible, DQL no tiene tantos expertos en la naturaleza, ni un cuerpo acumulado de conocimiento (en comparación con SQL) para ayudarte cuando te quedas atascado.
Por ahora estoy usando Symfony framework con Doctrine ORM, ¿qué hay de usar Doctrine junto con consultas simples? Por ejemplo, desde knpuniversity, puedo crear un método de repositorio personalizado como:
public function countNumberPrintedForCategory(Category $category)
{
$conn = $this->getEntityManager()
->getConnection();
$sql = ''
SELECT SUM(fc.numberPrinted) as fortunesPrinted, AVG(fc.numberPrinted) as fortunesAverage, cat.name
FROM fortune_cookie fc
INNER JOIN category cat ON cat.id = fc.category_id
WHERE fc.category_id = :category
'';
$stmt = $conn->prepare($sql);
$stmt->execute(array(''category'' => $category->getId()));
return $stmt->fetch();
... lines 30 - 37
}
Solo uso Entidades Doctrine para, por ejemplo, crear formularios de procesamiento. Cuando necesito una consulta más compleja, hago una declaración simple y tomo los valores que necesito. De este ejemplo, también puedo pasar Entidad como variable y tomar valores para hacer una consulta. Creo que esta solución es fácil de entender y toma menos tiempo crear formularios, pasar datos para ellos y escribir consultas complejas, no es tan difícil como escribirlos con Doctrine.