2010-11-01 2 views
2

Скажите, что у меня есть система с продуктами, которые могут иметь различные варианты оформления (или печати).'name' property in Doctrine 2

Большинство продуктов будут иметь одинаковый диапазон названий вариантов печати, но некоторые могут быть уникальными для одного продукта.

Например, я мог бы иметь крышку, которая может иметь три различных варианта отделки:

  1. Unbranded
  2. One Color Print
  3. вышивки

Моя цель пытается свести к минимуму украшения имена опций, созданные пользователями admin, поэтому они всегда одинаковы. И.Е. Я не хочу, чтобы некоторые варианты оформления назывались «1 цветная печать», а затем еще одна «Одноцветная печать».

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

Однако каждый вариант оформления имеет различные другие данные, такие как стоимость установки, время производства и т. Д., Которое зависит от продукта.

Например, у Hat1 и Hat2 есть опция украшения вышивки, но стоимость установки Hat1 составляет 49 долларов США, а стоимость установки Hat2 составляет всего 35 долларов.

Итак, мои вопросы: какой лучший способ структурировать сущности? Должен ли я иметь три объекта: Product, DecorationOption и DecorationOptionName? Или только два объекта: продукт и украшение?

Пожалуйста, смотрите мои примеры кода для дальнейшего понимания:

  1. Three entities option
  2. Two entities option

ответ

1

Я хотел бы использовать три сущности подход, с некоторыми незначительными различиями в семантике: Продукт, украшение, и ProductDecoration. По сути, это идея, стоящая за таблицей соединений «многие-ко-многим», но вы относитесь к соединению как к собственному объекту, где вы можете хранить дополнительную информацию.

Продукты и украшения - это их собственные отдельные объекты, а информация о взаимоотношениях между любым данным Продуктом и любым из них DecorationOption управляется в ProductDecoration. Вы можете достичь этого, используя два отношения OneToMany.

<?php 

class Product 
{ 
    /** @OneToMany(targetEntity="ProductDecoration", mappedBy="product") */ 
    private $productDecorations; 

} 


class Decoration 
{ 
    /** @Column(type="string") */ 
    private $name; 

    /** @OneToMany(targetEntity="ProductDecoration", mappedBy="decoration") */ 
    private $productDecorations; 
} 

class ProductDecorations 
{ 

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

    /** @ManyToOne(targetEntity="Decoration", inversedBy="productDecorations") */ 
    private $decoration; 

    /** @Column(type="integer") */ 
    private $setupCost; 

    /** @Column(type="integer") */ 
    private $productionTime 
} 

Единственный способ, которым я бы рекомендовал использовать подход два Entity, если вы можете ожидать никогда не нуждаясь больше, чем в столбце «имя» для лица украшения, и вы не беспокоить потенциальных проблем нормализации базы данных.

+0

Отлично! Считаете ли вы, что это было бы необходимо, если бы не было дополнительной информации о таблице соединений? Например, у продукта есть несколько изображений, все из которых будут помечены (Front, Back, Top и т. Д.), Но есть некоторые продукты, которые будут иметь метки кромки, но я хочу, чтобы именование было максимально согласованным. Взгляните сюда: http://pastie.org/1268445 – Cobby

+0

Ну, я думаю, что ImagePosition не является таблицей объединения ... но вы получаете идею/вопрос, я надеюсь. – Cobby

+1

Трудно сказать для каждого примера.В принципе, если вам нужен объект для выполнения бизнес-логики, у вас, вероятно, должен быть объект для него. Если у вас есть сложный набор логики, поддерживающий эту систему меток, создайте сущность. Если нет, вы, вероятно, согласитесь с двумя таблицами. Кроме того, у Doctrine есть ассоциация @ManyToMany, которая использует таблицу соединений без необходимости создания третьего объекта. –