Нужен простой ORM или DBAL для существующего приложения PHP
Вопрос
Я работаю над расширением существующего приложения PHP. К сожалению для меня, существующее приложение - это беспорядок. Это все код спагетти с необработанными вызовами mysql_*. Стон. Я не собираюсь сделать это в тех частях, которые я расширяю.
Итак, я ищу простой ORM DBAL, который я могу легко запустить и начать использовать. Желаемые функции:
- Он должен работать на существующей схеме базы данных. Предпочтительно с минимальной или без дополнительной конфигурации. Существующая схема базы данных является тем же качеством, что и существующий код PHP (без разумных соглашений имен, не нормализованных и т. Д.). Я не хочу тратить дни на преобразование схемы базы данных вручную в аннотированные свойства объекта A LA Doctrine 2.
- Он должен быть в состоянии работать вместе с существующими необработанными запросами mysql_*. Я понятия не имею, как ведут ведут увлажняющие Ормы, такие как Доктрина 2 или Пропл, когда сценарии вручную манипулируют данными в базе данных за спиной, но я предполагаю, что это не красиво.
- Он должен работать на PHP 5.2.x. Идентификатор любовь Для использования PHP 5.3, но я не имею никакого интереса в том, чтобы пройти через существующие 125 -километровые строки кодового беспорядка спагетти, чтобы убедиться, что он работает на PHP 5.3.
- Отношения не требуются. В нескольких местах, которые мне нужно, чтобы добраться до реляционных данных, я буду рад позвонить дополнительным
find()
или жеquery()
Или что -то, что я сам. - Бонусные баллы, если он имеет некоторую поддержку триггера (например,
beforeSave
,afterSave
) Не требуется, а просто приятно иметь.
Редактировать: Кто -то избавит меня от моих страданий. Я только что узнал, что строки кода спагетти 125K также меняют схему базы данных. Например, добавьте где -то дополнительную опцию, и целый ряд выступлений с альтернативными таблицами начинает летать. Я, вероятно, мог бы заполнить год ThedailyWTF с помощью этой кодовой базы. Итак, еще одно требование:
- Должен быть в состоянии автоматически справляться с изменяющейся схемой базы данных (например, добавление столбцов).
Я смотрел на несколько решений, но я не уверен, насколько хорошо они будут работать, учитывая требования. Доктрина 2, Redbeanphp и тому подобное требуют PHP 5.3, поэтому они отсутствуют. Существует унаследованная версия Redbeanphp для PHP 5.2.x, но я не знаю, будет ли она работать с грязной, существующей схемой базы данных. Novorm выглядит нормально для получения данных, но я не знаю, можно ли это настроить для существующей схемы базы данных, и как вы можете легко поместить данные обратно в базу данных.
В идеале я хотел бы что -то простое. Например:
$user = User::find($id);
$user->name = 'John Woo';
$user->save();
Или же:
$articles = ORM::find('article')->where('date' => '2010-01-01');
foreach ($articles as $article) {
echo $article->name;
}
Любые советы или даже альтернативные решения приветствуются!
Решение
Я использую...http://github.com/j4mie/idiorm/
Он также имеет активную реализацию записи в форме Парижа.
Что касается вашего редактирования. Idiorm справляется с изменяющимися схемами, а синтаксис почти точно соответствует тому типу, который вы хотите в вашем вопросе.
Другие советы
Насколько хорошо вы изучили доктрину? Я использую доктрину 1.2 для такого рода вещей. Довольно легко настроить, позволяет начать с существующей схемы. Он автоматически выясняет отношения между таблицами, которые имеют ограничения внешнего ключа.
Он обладает обширной поддержкой триггеров и поведения, поэтому бонусные баллы также могут быть потрачены, а также имеет реляционную поддержку, поэтому ваши дополнительные запросы не нужны. Он имеет красивую ленивую нагрузку, и он поставляется с гибким языком запросов (называемый DQL), который позволяет вам делать почти то же самое, что и в SQL лишь частью усилий.
Ваш пример будет выглядеть так:
/* 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();
Он должен быть в состоянии работать вместе с существующими необработанными запросами mysql_*. Я понятия не имею, как ведут ведут увлажняющие Ормы, такие как Доктрина 2 или Пропл, когда сценарии вручную манипулируют данными в базе данных за спиной, но я предполагаю, что это не красиво.
Ну, это технически невозможно автоматически управлять; База данных SQL просто не отталкивает вещи на ваш ORM, поэтому для обновления вещей, которые были изменены в фоновом режиме, вам нужно выполнить дополнительный запрос так или иначе. К счастью, доктрина делает это очень легко для вас:
/* @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();