Pregunta

Estoy trabajando en la ampliación de una aplicación PHP existente. Por desgracia para mí, la aplicación existente es un desastre. Es todo el código de espaguetis con mysql_ prima * Llamadas. Gemido. No hay manera de que voy a hacer que en las partes que les extiendo.

Por lo tanto, estoy buscando un simple ORM de DBAL que pueda caer fácilmente y comenzar a utilizar. características deseadas:

  • Se debe trabajar en un esquema de base de datos existente. Preferiblemente con mínima o ninguna configuración adicional. El esquema de base de datos existente es la misma calidad que el código existente de PHP (no hay convenciones de nombres práctica, no normalizado, etc.). No quiero pasar unos días convertir el esquema de la base manualmente en las propiedades del objeto anotados a la Doctrina 2.
  • Debe ser capaz de trabajar al lado de los mysql_ prima * consultas existentes. No tengo ni idea de cómo la hidratación de ORM como Doctrina 2 o Propel se comportan cuando las secuencias de comandos están manipulando manualmente los datos en la base de datos a la espalda, pero supongo que no es bonito.
  • Se debe ejecutar en PHP 5.2.x. Me amor para usar PHP 5.3 pero no tengo ningún interés en ir a través de los 125K líneas existentes de desastre código espagueti para asegurarse de que se ejecuta en PHP 5.3.
  • Las relaciones no se requiere. En los pocos lugares que necesita para llegar a los datos relacionales, estaré feliz de llamar a un find() adicional o query() o lo que sea yo mismo.
  • Los puntos de bonificación si se tiene algo de soporte de disparador (por ejemplo beforeSave, afterSave). No es un requisito, pero agradable tener.

Editar : Alguien me puso fuera de mi miseria. Me acabo de enterar que los 125K líneas de código espagueti también cambia el esquema de base de datos. Por ejemplo, añadir una opción en algún extra y una gran cantidad de instrucciones ALTER TABLE comienzan a volar. Probablemente podría llenar valor de TheDailyWTF de un año con este código base. Por lo tanto, un requisito más:

  • Debe ser capaz de hacer frente a un esquema de base de cambiar de forma automática (por ejemplo, la adición de columnas).

He estado buscando en algunas soluciones, pero estoy seguro de lo bien que funcionaría bien, dados los requisitos. Doctrina 2, RedBeanPhp y similares, requieren PHP 5.3, por lo que están fuera. Hay una versión legado de RedBeanPhp para PHP 5.2.x, pero no sé si funcionaría con un desordenado, el esquema de base de datos existente. NotORM se ve bien para la obtención de datos a cabo, pero no sé si puede ser configurado para el esquema de base de datos existente, y cómo los datos se puede poner fácilmente de nuevo en la base de datos.

Lo ideal sería que me gustaría algo sencillo. Por ejemplo:

$user = User::find($id);
$user->name = 'John Woo';
$user->save();

O:

$articles = ORM::find('article')->where('date' => '2010-01-01');
foreach ($articles as $article) {
    echo $article->name;
}

Cualquier consejo o incluso soluciones alternativas son bienvenidos!

¿Fue útil?

Solución

Yo uso ... http://github.com/j4mie/idiorm/

tiene una implementación registro activo también en forma de París.

Con respecto a su edición. Idiorm hace frente a cambios de esquemas y la sintaxis coincide casi exactamente con el tipo que desea en su pregunta.

Otros consejos

¿Qué tan bien se mira en Doctrina? Estoy usando Doctrina 1.2 para este tipo de cosas. Muy fácil de instalar, le permite comenzar con un esquema existente. Se calcula automáticamente las relaciones entre las tablas que tienen restricciones de clave externa.

Se tiene una amplia gatillo y apoyo de la conducta, por lo que los puntos de bonificación se pueden pasar también, y tiene el apoyo relacional, así, por lo que sus consultas adicionales no son necesarios. Tiene hermosa carga diferida, y viene con un lenguaje de consulta flexible (llamado DQL) que le permite hacer casi exactamente las mismas cosas que se pueden hacer en SQL en sólo una fracción del esfuerzo.

Su ejemplo se vería así:

/* To just find one user */
$user = Doctrine::getTable('User')->findOneById($id);

/* Alternative - illustrating DQL */
$user = Doctrine_Query::create()
    ->from('User u')
    ->where('u.id = ?',array($id))
    ->fetchOne();

$user->name = 'John Woo';
$user->save();

Debe ser capaz de trabajar al lado de los mysql_ prima * consultas existentes. No tengo ni idea de cómo la hidratación de ORM como Doctrina 2 o Propel se comportan cuando las secuencias de comandos están manipulando manualmente los datos en la base de datos a la espalda, pero supongo que no es bonito.

Bueno, eso es técnicamente imposible de auto-gestión; una base de datos SQL simplemente no está empujando cosas de vuelta a su ORM, por lo que a la materia de actualización que se ha cambiado en el fondo, es necesario realizar una consulta adicional de un modo u otro. Afortunadamente, esta doctrina hace muy fácil para usted:

/* @var User $user */
/* Change a user using some raw mysql queries in my spaghetti function */
$this->feedSpaghetti($user->id);

/* Reload changes from database */
$user->refresh();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top