Л А Б О Р А Т О Р И Я

актуальных

РЕШЕНИЙ


Object-relational mapping (ORM) - TEST

решение тестовой задачи c применением ORM RedBeanPHP

Изложенный материал рассчитан на подготовленных разработчиков, обладающих знаниями ООП (объектно-ориентированного программирования), языка PHP, понимание назначения ORM, знание функционала RedBeanPHP.

Получил по запросу от одной компании тестовую задачу, чтобы прокачать свои текущие навыки, и понять уровень требований на рынке по моей специализации. Ранее не использовал ORM, потому что применение связано не только с плюсами, но и имеет свои минусы. Да и к тому же, постоянно приходится писать непростые запросы на SQL. Использование ORM в таких случаях, скорее усложняет, нежели облегчает работу.

Описание задачи:

Задание ORM

Поискав немного в сети Интернет доступные ORM остановился на RedBeanPHP, которая показалась мне простой в установке и использовании. И к тому же, одно из информационных сообщений на сайте разработчиков порадовало - похоже ребята что-то знают :)

Composer

Размышления над реализацией (этап загрузки):

  1. Разобьем задачу на два этапа. Первый этап - загрузка в базу данных тестовых значений (см. скрин "Скрипт загрузка"), второй - выборка (см. скрин "Скрипт выборка"). Для каждого этапа будем делать отдельный скрипт.
  2. Сформируем массив тестовых данных для ввода в базу $arr_books (см. стр. 11-21). Ключами массива будут названия книг, а значениями - вложенные массивы с именами авторов.
  3. Будем перебирать каждый элемент массива $arr_books (см. стр. 23), чтобы заносить их последовательно в базу данных.
  4. Между таблицами 'books'-список книг и 'authors' - список авторов должна быть установлена связь типа "многие-ко-многим". В структуре наших тестовых данных каждому автору будем ставить в соответствие название книги.
  5. Обходим в цикле все элементы массива тестовых данных и присваиваем значение ключей $key полю 'title' объекта (бина) $book. Это значение попадет в колонку 'title' таблицы 'books' при сохранении в базу данных.
  6. Стоит обратить внимание на обьявление таблицы 'authors', последний параметр TRUE в методе 'dispense'. Если не установить этот параметр, то при единственном значении (одно имя автора) 'dispense' вернет объект, когда больше значений, то вернет массив объектов. Установка 'TRUE' заставляет метод всегда возвращать массив объектов. Количество элементов (бинов) в массиве 'authors' должно соответствовать размерности массива авторов для соответствующего ключа-книги.
  7. Для каждого ключа массива входных тестовых данных перебираем массив авторов (см. стр. 30) и добавляем новый элемент (имя автора), если он не существует в ранее заданном общем списке 'authors', либо возвращаем то значение (бин), которое уже было ранее задано (см. стр. 31). Это позволит избежать дублирования имен авторов.
  8. Устанавливаем связь между автором и книгой (см. стр. 32).
  9. Сохраняем установленные данные для текущего цикла (см. стр. 35), где $authors - массив сохраняемых в базу данных строк (бинов).
  10. После прохождения всех циклов обработки массива тестовых данных закрываем соединение с базой данных (см. стр. 37).

Скрипт загрузка:

ORM load script

Таблицы базы данных созданные после исполнения скрипта загрузки:

tables MySQL

RedBeanPHP создал помимо таблиц для хранения названий книг и имен авторов промежуточную таблицу "authors_books", в которой содержатся связи между двумя таблицами наших тестовых данных.

Теперь надо переходить ко второму этапу решения нашего теста, выводу данных из созданных таблиц.

Размышления над реализацией (этап выборка):

  1. Выборка данных состоит из двух независимых частей: выборка книг заданного автора по ID из таблицы 'authors' с выводом на страницу в виде списка, и вывод списка авторов одной конкретно заданной книги, у которой несколько авторов. Части реализации ограничены синими маркерами.
  2. Здесь все достаточно просто, в первой части задаем ID автора (см. стр. 11), загружаем объект данных (бин) для этого 'id' из таблицы 'authors' базы данных (см. стр. 12).
  3. По полученному объекту загружаем все связанные с ним объекты (бины) из таблицы 'books' (см. стр. 13).
  4. Выводим в цикле все интересующие нас книги заданного по ID автора (см. стр. 16-18).
  5. Реализация второй части немного отличается, потому что задано название книги (см. стр. 20).
  6. Находим объект искомой книги по названию (см. стр. 21). Условно будем считать, что у нас нет одинаковых названий, в противном случае, мы получим только первое встретившееся по сответствию поиску название.
  7. Получаем всех авторов, которые связаны с полученным объектом книги (см. стр. 22).
  8. Выводим в цикле всех авторов интересующей нас книги (см. стр. 25-27).

Скрипт выборка:

ORM getdata script

Вот такой результат получился:

RedBeanPHP result

Удачи в разработке!



другие материалы: