Добрый день! Жил себе счастливо пока не узнал что в архитектуре должен присутствовать слой классов-сущностей, описывающих предметную область. Вся бизнес-логика должна оперировать именно этими объектами (а не объектами модели данных, как у меня раньше). Примерно так:
на входе $id заказа
$orders = new Orders();
$order = new Order();
$order = $orders->get_order_by_id($id); //получаем заказ по id
$order->sum = 100; //меняем сумму заказа на 100
$orders->change_order($order); //изменяем заказ
Всё красиво, наглядно, код не зависит от способа хранения данных, нам не важно как и откуда get_order_by_id получает данные, а change_order сохраняет и т п. Но это до тех пор пока в классе Order не появились поля "Работы по заказу", "Материалы по заказу", которые представляют собой массивы объектов типа Work и Material.
class Order
{
public $works = array();
public $materials = array();
public $sum;
}
Ну и собственно вопрос, допустим мне нужно вывезти все заказы. С учётом добавленных полей $works и $materials в методе
$orders->get_order_by_id($id)
становится много обращений к базе. Помимо поучения самого заказа из БД, нужно еще одним селектом получить работы по заказу (заполнить массив $works) и еще одним материалы по заказу (заполнить массив $materials). Итого 3 обращения к базе для одного заказа. А если нужно вывести заказов сотню другую? А ведь объекты work сам по себе могут содержать такие поля, например список исполнителей, допущенных к выполнению данной работы. Так что придется опять лезть в базу. не могу же я вернуть "недоделанный" объект work, без исполнителей. Другое дело что обычно, при выводе заказов в таблицу список исполнителей для работ и не нужен. Так что, возвращать объект work без него?
Можно конечно обойтись одним селектом, но в нём придется вывести только по одной работе и одному материалу (допустим просто первые в массиве). Но тогда объект Order уже не будет тем чем задумывался, в нём вместо массива работ будет только одна работа.
Кто-нибудь сталкивался, как это всё обходится? Или забить на эти сущности и проблема отпадает сама собой.