2010-11-01 18 views
2

Disons que j'ai un système avec des produits qui peuvent avoir diverses options de décoration (ou d'impression).Propriété 'name' dans Doctrine 2

La plupart des produits auront une gamme similaire de noms d'options d'impression, mais certains peuvent être uniques pour un seul produit.

Par exemple, je pourrais avoir un plafond qui pourrait avoir trois options de décoration différentes:

  1. Unbranded
  2. une impression couleur
  3. broderie

Mon but est d'essayer de minimiser la décoration les noms d'options créés par les utilisateurs admin afin qu'ils soient toujours les mêmes. C'EST À DIRE. Je ne veux pas que certaines options de décoration soient appelées "Impression 1 Couleur" et une autre appelée "Impression Une Couleur". Donc, mon plan est dans l'interface utilisateur est d'avoir une liste déroulante des noms des options de décoration existantes, mais aussi leur donner la possibilité d'en ajouter un nouveau (pour les cas de bord). Cependant, chaque option de décoration comporte diverses autres données, telles que le coût d'installation, le temps de production, etc., qui varie en fonction du produit. Par exemple, Hat1 et Hat2 peuvent avoir une option de décoration de broderie, mais le coût d'installation de Hat1 est de 49 $ et celui de Hat2 est seulement de 35 $.

Donc, mes questions sont, quelle est la meilleure façon de structurer mes entités? Dois-je avoir trois entités: Product, DecorationOption et DecorationOptionName? Ou seulement deux entités: Produit et DécorationOption?

S'il vous plaît voir mes exemples de code pour mieux comprendre:

  1. Three entities option
  2. Two entities option

Répondre

1

Je voudrais utiliser les trois approche de l'entité, avec quelques différences mineures dans la sémantique: produit, décoration, et ProductDecoration. C'est essentiellement l'idée d'une table de jointure plusieurs-à-plusieurs, mais vous traitez la jointure comme son propre objet, où vous pouvez stocker des informations supplémentaires. Les produits et la décoration sont des entités distinctes et les informations sur la relation entre un produit donné et un objet DecorationOption donné sont gérées dans ProductDecoration. Vous pouvez y parvenir en utilisant deux relations 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 
} 

La seule façon que je vous recommande d'utiliser l'approche de deux entités est si vous pouvez anticiper jamais avoir besoin de plus de la colonne « nom » pour l'entité de décoration, et vous n'êtes pas dérangé par des problèmes de normalisation des bases de données potentielles.

+0

Parfait! Pensez-vous que cela serait nécessaire s'il n'y avait pas d'informations supplémentaires sur la table de jonction? Par exemple, un produit a plusieurs images qui seront toutes étiquetées (Front, Back, Top, etc.) mais il y a des produits qui auront des étiquettes edge-case, mais je veux garder un nom aussi cohérent que possible. Jetez un oeil ici: http://pastie.org/1268445 – Cobby

+0

Eh bien, je suppose que ImagePosition n'est pas la table de jointure ... mais vous obtenez l'idée/question que j'espère. – Cobby

+1

C'est difficile à dire pour chaque exemple.Fondamentalement, si vous avez besoin d'un objet pour exécuter la logique métier, vous devriez probablement avoir une entité pour cela. Si vous disposez d'un ensemble complexe de logique prenant en charge ce système d'étiquettes, créez une entité. Sinon, vous êtes probablement d'accord avec les deux tables. En outre, Doctrine possède une association @ManyToMany qui utilise une table de jointure sans avoir besoin de créer une troisième entité. –