eomeroff
quiste
-
Gracias por el enlace y YaLinqo
– Empollón guapo
13 de noviembre de 2013 a las 8:42
-
Tuve que usar php 5.3, así que tuve que descargar una versión anterior de YaLinqo. Gracias.
– aerosón
19/10/2015 a las 20:43
-
Lo voté, pero luego descubrí que YaLinqo no está exactamente listo para la producción. Sin documentación, comportamiento inesperado. Funciona, pero decidí no hacerlo después de probarlo. No puedo eliminar mi voto, así que lo bloqueé. Cambiado a PINQ.
– Dima Stefantsov
25 de febrero de 2016 a las 7:09
-
@DimaStefantsov ¿Podría dar más detalles sobre “no está listo para la producción”, “comportamiento inesperado” y especialmente sobre “sin documentación”? Casi todas las quejas sobre el “comportamiento inesperado” de YaLinqo tienden a provenir de desarrolladores que no leen la documentación del método “toArray” (colapsa las claves iguales, por lo que algunos resultados pueden “desaparecer”). La documentación de referencia de YaLinqo es la mejor, pero los artículos introductorios de Pinq son mejores. Pinq hubiera sido excelente si hubiera al menos un proveedor de consultas, pero no hubo ningún progreso desde la introducción de la demostración de MySQL. 🙁 Espero que TimeToogo finalmente encuentre algo de tiempo para ello.
– Athari
13 de abril de 2016 a las 5:49
-
@DimaStefantsov Si logra modificar colecciones usando YaLinqo, informe un error, se lo agradecería mucho. 🙂 Y también conserva claves, como Pinq. Puedes ignorarlos o descartarlos usando
toList
(otoDictionary(value, increment)
) o, si un método tieneresultSelectorKey
argumento, pásele la función de incremento. En el caso de Pinq, puede usar métodosreindex
yindexBy
, si no me equivoco. Aunque en realidad, simplemente ignorar las teclas suele ser la opción más simple. La razón para conservar las claves es que a veces son necesarias, por lo que el descarte de información debe ser explícito.– Athari
13 de abril de 2016 a las 9:24
Athari
(Desarrollador de YaLinqo aquí).
Actualmente, hay tres implementaciones principales de LINQ en PHP:
-
yalinqo — la biblioteca más minimalista en cuanto a arquitectura (4 clases), pero la más funcional, la más eficaz, con la mejor documentación y la única compatible con “string lambdas”.
-
ginq — una biblioteca de tamaño promedio (70 clases), a la par con YaLinqo en el número de funciones, entre 1,5 y 3 veces más lenta, contiene colecciones personalizadas, iteradores y comparadores, la documentación contiene tipos de argumentos en el mejor de los casos.
-
Pinq — una enorme biblioteca (500 clases), admite el análisis de PHP y la transformación a SQL y todo lo demás, mucho más lento que el resto, tiene un sitio web bonito, pero su documentación es promedio y falta funcionalidad.
No vale la pena mencionar otras bibliotecas (um, está bien, LINQ para PHP, Phinq, PHPLinq y Plinq). Apenas se prueban, las evaluaciones en ellos no son perezosas, se basan en conceptos extraños ajenos a los desarrolladores de PHP y .NET. PHPLinq es el único que realmente admite bases de datos, pero es más como DAL para generar SQL con un orden de llamada fijo en lugar de LINQ.
Si me pregunta qué biblioteca elegir, solo diría que use YaLinqo si necesita trabajar con matrices y objetos y cualquier biblioteca ORM (no LINQ) cuando necesite trabajar con bases de datos. Pero intentaré explicar por qué.
Actuación
YaLinqo es, con mucho, la más rápida de las bibliotecas. Está diseñado para ser rápido: se basa únicamente en generadores (que producen los iteradores más rápidos); solo usa arreglos (no se implementan colecciones personalizadas como envoltorios alrededor de los arreglos). Su evolución se está deshaciendo de características lentas y obsoletas: eliminando colecciones personalizadas, eliminando iteradores explícitos; y empeorar la calidad del código si mejora el rendimiento: elegir entre múltiples funciones de clasificación en lugar de usar una solución genérica, copiar y pegar código para reducir la cantidad de llamadas a funciones.
Ginq y Pinq tomaron otro enfoque, usan clases iteradoras explícitas. Muerde una gran parte del rendimiento, pero permite usar iteradores por separado de la sintaxis del método fluido.
Además, ambos tienen trampas de rendimiento. Cuando utiliza la sintaxis de los accesores de propiedad en Ginq, su código se vuelve 5 veces más lento. También te esperan sorpresas cuando intentas usar arreglos como claves. Cuando usa unirse en Pinq, su código se vuelve cientos o miles de veces más lento (no estoy bromeando, vea los enlaces a continuación) El rendimiento de unirse a Pinq se solucionó después de mi informe de error.
Con YaLinqo, es más simple: o no funciona (como matrices en las teclas), o funciona con el rendimiento esperado. La versión 1 tenía algunos trucos para hacerlo posible, como en LINQ original, pero la versión actual no. Puede requerir algunos ajustes: por ejemplo, en lugar de usar un comparador de igualdad, deberá producir claves que sean iguales en los mismos casos.
Ver artículos: Comparación de LINQ para PHP: YaLinqo, Ginq, Pinq en CodeProject, LINQ para PHP: la velocidad importa en Habrahabr (ruso). Ellos cubren YaLinqoPerfrepositorio git con pruebas de rendimiento que comparan PHP, YaLinqo, Ginq y Pinq sin procesar.
Características
La cantidad de métodos LINQ en YaLinqo y Ginq, así como su funcionalidad, son bastante parecidos. Diría que no hay un claro ganador, ya que ambas bibliotecas proporcionan métodos que la otra no tiene. En su mayoría son métodos adicionales que no están disponibles en el LINQ original, por lo que no me preocuparía demasiado.
Pinq parece un pueblo desierto. Los métodos son básicos y, a menudo, apenas se pueden utilizar. Mientras escribía pruebas de rendimiento, a menudo tenía que recurrir a soluciones personalizadas más complejas para Pinq, mientras que el código para YaLinqo y Pinq generalmente difería solo en los nombres de los métodos (diferentes convenciones de nomenclatura: “desc” frente a “descending” y cosas por el estilo).
Por otro lado, Pinq es el único que admite el análisis de PHP y la generación de SQL a partir de él. Desafortunadamente, el único proveedor de consultas es para MySQL y su estado es una “demostración”. Entonces, si bien Pinq tiene esta característica única, lamentablemente aún no se puede usar.
Si desea que LINQ a las bases de datos se convierta en una realidad, supongo que no tiene más remedio que comenzar a trabajar en un proveedor de consultas para Pinq. Es una tarea muy compleja y dudo que un desarrollador pueda producir proveedores de consultas de alta calidad solo para todas las bases de datos.
Lo que tiene Ginq que YaLinqo no tiene es una arquitectura más avanzada. Dónde Set
y Dictionary
las clases se usan en Ginq, verá matrices y solo matrices en YaLinqo. Dónde Comparer
y EqualityComparer
se usan en Ginq, verá cierres (o ningún equivalente) en YaLinqo. En esencia, es una decisión de diseño: si la biblioteca debe usar conceptos naturales para programadores en este lenguaje o para programadores acostumbrados a la biblioteca en otros lenguajes. Las bibliotecas acaban de hacer una elección.
Cabe señalar que una arquitectura más compleja no equivale a una buena implementación. usos de ginq public function hash($v) { return sha1(serialize($v)); }
para calcular claves hash en “conjuntos”, por ejemplo.
Documentación
YaLinqo se destaca con una buena documentación de referencia en PHPDoc y en línea (generada a partir de PHPDoc). Se trata principalmente de documentación de LINQ en .NET de MSDN adaptada a PHP. Si sabe qué es MSDN, conoce su calidad.
La documentación de Ginq es casi inexistente, por lo general solo contiene sugerencias de tipo de argumento.
La documentación de Pinq es relativamente buena (cada método principal tiene una oración o dos que explican lo que hace), pero no es rival para la documentación de YaLinqo.
Tanto Ginq como Pinq tienen buenos artículos introductorios en la web que explican conceptos a los nuevos desarrolladores. YaLinqo no tiene ninguna documentación introductoria además de un ejemplo loco en Léame que no explica nada.
Pinq también tiene un sitio web bonito, el único de las tres bibliotecas.
Todo lo demas
Las tres bibliotecas tienen una buena cobertura de prueba, integración con Composer, licencias permisivas de código abierto y otras propiedades de las bibliotecas que están listas para usarse en producción.
Para aquellos que se preocupan por las versiones antiguas de PHP, YaLinqo 1.x requiere PHP 5.3, YaLinqo 2.x requiere PHP 5.5, Ginq requiere PHP 5.3, Pinq requiere PHP 5.4.
PD: si tiene alguna adición, o cree que soy parcial, comente. Los comentarios son lo que extraño después de escribir tanto texto. 🙂
justin niessner
-
Me entristece ver una respuesta aceptada que promueve la escritura de código php dentro de variables de cadena como
where('$name => strlen($name) < 5')
… Ni siquiera quiero imaginar el dolor experimentado al tener que cambiar el nombre de cualquier clase, propiedad, variable, etc. La forma correcta de hacer las cosas sería usando construcciones de lenguaje real (delegados/funciones anon), como ginq/pinq hacer.– Mladen B.
20 de junio de 2018 a las 10:06
Mucho ha cambiado en el mundo de PHP en los últimos años, lo que hace que la mayoría de las respuestas anteriores estén desactualizadas.
Aquí hay una nueva tabla de comparación de las principales implementaciones de LINQ para PHP:
Todas estas bibliotecas se pueden instalar a través de compositor.
En resumen recomendaría el PIN Q biblioteca (estoy sesgado ya que soy el autor) porque se mantiene activamente, está bien documentado y probado y proporciona una implementación de LINQ verdadero en PHP.
Por verdadero LINQ Me refiero a que la biblioteca no solo es una API de recopilación fluida para matrices en memoria, sino que también implementa el análisis de consultas reales con árboles de expresión. Esto permite la integración de esta API con fuentes de datos externas, por lo tanto PAGSHP Enintegrado qmuy Se puede ver una demostración de dicha funcionalidad aquí donde las consultas se compilan en SQL y se ejecutan en una base de datos MySQL:
nunca
También hay phinq que tiene una versión más reciente que PHPLinq, y parece parecerse más a LINQ a objetos para C# que PHPLinq.
Comunidad
¿Buena biblioteca PHP ORM?
Una respuesta a esta pregunta dice
Mira en Doctrina.
Doctrine 1.2 implementa Active Record. Doctrine 2+ es un ORM DataMapper.
Además, echa un vistazo a Xyster. Se basa en el patrón Data Mapper.
Además, eche un vistazo a DataMapper vs. Active Record.
Pedro Mortensen
Ver PHPLinq (un conjunto de clases PHP que imitan LINQ de C#3.0).
¿A qué LINQ te refieres? LINQ a objetos? ¿LINQ a SQL? ¿Marco de la entidad? LINQ a conjuntos de datos?
– Matías
26 de abril de 2011 a las 15:12
Me refiero a la consulta integrada en el idioma, para consultar cualquier colección, no en tecnología o plataforma que contenga linq en su nombre.
– eomeroff
26 de abril de 2011 a las 15:18
“consultar cualquier colección” – eso se llama LINQ to Objects entonces (ver msdn.microsoft.com/en-us/library/bb397919.aspx). Muchas personas, sin embargo, asocian los ORM con “LINQ”.
– Matías
26 de abril de 2011 a las 15:26
¿Qué tal un equivalente a LINQ to Entities? Si no, ¿qué pasa con LINQ to SQL?
– Fabien Warniez
16 de agosto de 2012 a las 0:06
El número y la calidad de las respuestas hacen que esta sea una pregunta muy útil. A juzgar por las fechas, ya ha sido reabierto y cerrado. Debe dejarse abierto porque claramente hay son buenas respuestas
– Panagiotis Kanavos
27/09/2016 a las 13:43