Нужен простой ORM или DBAL для существующего приложения PHP

StackOverflow https://stackoverflow.com/questions/4721768

  •  12-10-2019
  •  | 
  •  

Вопрос

Я работаю над расширением существующего приложения 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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top