Нужны пояснения по поводу вложенных моделей - PullRequest
0 голосов
/ 01 сентября 2010

Мне нужен пример работы с вложенными моделями.

Предположим, у нас есть несколько приложений и моделей для управления заказами: Order, Position, Item.

Order может содержать позиции иПозиции могут содержать элементы.

Вопрос заключается в следующем: как обрабатывать выбор данных?

В некоторых случаях необходимо:

  • Получить список заказов с позициями иПредметы (как в моем примере кода)
  • Получить только список ордеров (без позиций и предметов)
  • Получить некоторую статистику, например, общее количество всех предметов в одной позиции

Я могу сделать что-то подобное:

class Order_Mapper
{
    public function getOrders($criteria)
    {
        $orders = array(); // Get order list from DB

        foreach($orders as $order)
        {
            $positions = Position_Mapper::getPositionsByOrderId($order->id);

            foreach($positions as $position)
            {
                $order->addPosition($position);
            }
        }

        return $orders;
    }
}

class Position_Mapper
{
    public function getPositionsByOrderId($order_id)
    {
        $positions = array(); // Get position list from DB

        foreach($positions as $position)
        {
            $items = Item_Mapper::getItemsByPositionId($position->id);

            foreach($items as $item)
            {
                $position->addItem($item);
            }
        }

        return $positions;
    }
}

... но это неэффективно, потому что нужно много SQL-запросов, один для выбора ордера, затем один для каждого ордера, чтобы получить позиции изатем по одному на каждую Позицию, чтобы получить Предметы.

Я довольно неопытен в MVC, поэтому любая помощь приветствуется!


В ответ на Доктрину - я действительно не хотел учитьсяновый набор ORM, ни я не надеваюне против написания SQL-запросов вручную.Мне просто нужна идея, как выполнять вышеупомянутые задачи.

Здесь - моя вторая попытка выполнить все упомянутые выше варианты использования без дополнительных затрат.Пожалуйста, посмотрите и расскажите мне свои мысли.Код очень прост.

1 Ответ

0 голосов
/ 01 сентября 2010

В таком случае я бы использовал расширенный объектный реляционный картограф, такой как Doctrine . Тогда вы можете избежать проблемы n + 1 и использовать сложные запросы с JOIN для того, чтобы сразу получать связанные данные вместо выбора всех заказов, а затем в цикле выбирать все позиции для каждого заказа и т. Д. который отображает структуру базы данных на объекты. Вместо этого вы просто используете репозитории, которые предоставляют такие методы, как getAllOrders и т. Д., Задаете ваши запросы и позволяете Doctrine выполнять тяжелую работу.

Когда вам нужен более строковый подход к запросам в стиле отчета для статистики и т. Д. Doctrine afaik также поддерживает нативные запросы, когда вы переходите непосредственно к базе данных и используете собственный SQL.

Еще немного информации на эту тему:

Существует довольно много вопросов по этим темам и о stackoverflow. Это всего лишь несколько советов, с которых можно начать. Поскольку у вас, похоже, нет большого опыта в этих темах, имейте в виду, что есть кривая обучения, но это действительно того стоит, поскольку вы можете приручить даже сложные сценарии с помощью этих технологий и шаблонов.

...