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

#php #database #doctrine-orm

#php #База данных #doctrine-orm

Вопрос:

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

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

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

Следовательно, моя модель заказа выглядит следующим образом:

 /**
 * @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 (doctrine query language) для такого рода базовых вещей или есть способ легко получить связанные объекты? Я имею в виду, в противном случае в этом не было бы никакого смысла, верно? Кроме того, правильно ли я выполняю эти ассоциации? Я действительно запутался в этой самой базовой модели… Подробная помощь действительно ценится. Спасибо.

Ответ №1:

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

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

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

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


Я действительно запутался в этой самой базовой модели…

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

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

Комментарии:

1. Это двунаправленное отношение «один ко многим» было тем, что я искал. Теперь это имеет смысл… Спасибо!