Получение связанных записей в Doctrine 2

Я решил, что было бы неплохо познакомиться с ORM, и выбрал Doctrine 2 в качестве предпочтительного ORM.

Я работаю над тестовым проектом, чтобы изучить основы Doctrine. Хотя большинство людей обычно ведет блог, я решил сделать простое приложение, в котором можно сохранять заказы и отслеживать их. Моя схема базы данных будет следующей:

User
    id
    name
Product
    id
    name
    price
Sales_order
    id
    user_id
    product_id
    quantity
    unit_price

Следовательно, моя модель Order выглядит так:

/**
 * @Entity
 * @Table(name="sales_order")
 */
class Order {

    /**
     * @Id
     * @Column(type="integer", nullable=false)
     * @GeneratedValue(strategy="AUTO")
     */
    private $Id;

    /**
     * @OneToOne(targetEntity="User", inversedBy="user")
     */
    private $user;

    /**
     * @OneToOne(targetEntity="Product", inversedBy="product")
     */
    private $product;

    /**
     * @Column(type="integer", nullable=false)
     */
    private $quantity;
}

Теперь вопрос в том, есть ли простой способ получить доступ ко всем заказам из пользовательской модели? Должен ли я писать DQL (язык запросов доктрины) для таких базовых вещей или есть способ легко получить связанные сущности? Я имею в виду, что иначе в этом не было бы никакого смысла, верно? Кроме того, правильно ли я делаю эти ассоциации? Я действительно запутался в этой очень простой модели... Очень ценится подробная помощь. Спасибо.


person Ege Özcan    schedule 08.02.2011    source источник


Ответы (1)


Во-первых, не слишком беспокойтесь о дизайне базы данных. Вы должны проектировать свои сущности и использовать SchemaTool.

Теперь вопрос в том, есть ли простой способ получить доступ ко всем заказам из пользовательской модели?

Вы имеете в виду доступ ко всем заказам из пользовательской модели или доступ ко всем заказам, связанным с пользователем a?

Если вы имели в виду первое, значит, вы делаете что-то неправильно (см. ниже). Если вы имели в виду последнее, вам следует настроить двусторонняя связь между заказами и пользователями. (Кстати, это будет OneToMany, а не OneToOne, поскольку у одного пользователя, вероятно, будет много заказов).


Я действительно запутался в этой очень простой модели...

Я думаю, что у вас, как и у многих PHP-программистов, возникли проблемы с фундаментальным пониманием паттерна DataMapper и, в конечном счете, дизайн, управляемый предметной областью. Помните, что вы имеете дело с сохраняемыми объектами, а не с таблицами базы данных.

Я не могу предоставить здесь подробную информацию, потому что я буду писать книгу, поэтому я бы порекомендовал вам приобрести книгу по проектированию, управляемому предметной областью, чтобы помочь начать работу с принципами. Доступно несколько хороших онлайн-ресурсов, таких как серия сообщений в блоге от Федерико Каргнелутти, однако они не относятся к Doctrine 2.

person Cobby    schedule 08.02.2011
comment
Это двунаправленное отношение «один ко многим» было тем, что я искал. Теперь это имеет смысл... Спасибо! - person Ege Özcan; 08.02.2011