DBIx :: Class (Perl ORM) эквивалент в PHP - PullRequest
0 голосов
/ 08 февраля 2019

Мы запустили наше веб-приложение в 2012 году, когда Perl был еще популярен.Теперь мы хотим переопределить его в PHP, предпочтительно в Laravel.Однако я упускаю возможности DBIx :: Class в их стандартном ORM, Eloquent, и альтернативе, Doctrine, в чтении документов, кажется более сложным, но также не решает проблему.Для чего я использую DBIx :: Class:

  • Регенерация классов моделей из чтения структуры БД с сохранением любого кода, который был добавлен к ним (должен иметь).
  • Создание сложных запросов(включая вложенные объединения, подзапросы) из конструкций на чистом языке, SQL не требуется (должен иметь).

Пример кода:

rows => $rows,
page => $page,
'select' => [
        'entity_id',
        { group_concat => [ { distinct => 'pictures.id' } ], -as => 'photos' },
        { '' => [ 'entity.name' ], -as => 'entity_name' },
        { '' => [ 'municipality.name' ], -as => 'municipality_name' },
        { '' => [ 'me.birth_date' ], -as => 'bd' },
        { concat => [ { date_format => [ 'me.birth_date', \$c->config->{dateFormat} ] }, \"' ('", { timestampdiff => [ \'YEAR', 'me.birth_date', \'CURDATE()' ] }, \"')'" ], -as
        { date_format => [ 'me.birth_date', \$c->config->{dateFormat} ], -as => 'bd1' },
        { timestampdiff => [ \'YEAR', 'me.birth_date', \'CURDATE()' ], -as => 'bd2' },
        { '' => [ 'entity_state_type.name' ], -as => 'entity_state_name' },
        { '' => [ 'data_list_item.name' ], -as => 'entity_state_reason_name' },
        { '' => [ 'entity_state.note_text' ], -as => 'entity_state_note' },
        { '' => [ { if => [ 'entity.archived', \"'Yes'", \"''" ] } ], -as => 'entity_archived' },
],
join => {
        entity => [ 'municipality', 'pictures', { 'entity_state' => [ 'entity_state_type', 'data_list_item' ] } ],
},
group_by => [ 'entity.id' ],
  • Подкласс результата (строка) и классы набора результатов для прозрачного добавления пользовательских условий ограничения на основе ролей в код приложения (должен иметь или эквивалентен).

Вызов и результирующий запрос:

$c->model('DB::Person')->all

SELECT * FROM person WHERE owner = <user_id>
  • ... если параметры безопасности роли пользователя указывают, что пользователь должен иметь доступ только к своим личностям.
  • Параметры безопасности считываются из БД при запуске запроса и указывают, какие условия безопасности (отдельные классы) к которым должны применятьсятаблица.
  • Это убирает всю безопасность из кода приложения, где ошибки чаще всего допускаются.

Какая библиотека PHP позволит нам реализовать это?

...