2016-03-22 85 views
0

我有3個實體:產品,ProductFeatures(如顏色,尺寸等)和ProductFeaturesVarient(如紅色,橙色,綠色,黃色,32,34,36等)。Symfony 2 +原則,加入多個表

產品可以具有顏色,尺寸等功能。每個功能都可以有變體。喜歡紅色,橙色和32,34尺碼的Polo T恤。

我想通過連接表關聯這3個實體。我知道我必須創建一個類似ProductFeatureVariant的實體,但我不知道如何定義關係。

因此,具有字段的第4個實體ProductFeatureVariant:product_id,feature_id和feature_variant_id。

任何人都可以幫我定義這個嗎?

+0

您通常不需要自己創建連接表。使用關係(產品的功能,功能的顏色,功能的大小等) – JimL

+0

似乎我的表名稱混淆。這是我期待 ** **產品的基本結構:ID,姓名 **功能**:ID,Feature_title ** ** FeatureVariant:ID,FEATURE_ID,variant_title 最終結合的表應該是這樣的: ** ProductFeatureVariant **:product_id,feature_id和variant_id –

回答

0

您將只需要3個一對多關係,可以是雙向的。

/** @Entity */ 
class Product 
{ 
    /** @Column(type="integer") */ 
    private $id; 
    /** @Column(length=140) */ 
    private $name; 
    /** 
    * @OneToMany(targetEntity="ProductFeature", mappedBy="product") 
    */ 
    private $features; 

    public function __construct() { 
     $this->features = new ArrayCollection(); 
    } 
} 

/** @Entity */ 
class ProductFeature 
{ 
    /** @Column(type="integer") */ 
    private $id; 
    /** @Column(length=140) */ 
    private $name; 
    /** 
    * @ManyToOne(targetEntity="Product", inversedBy="features") 
    * @JoinColumn(name="product_id", referencedColumnName="id") 
    */ 
    private $product; 
    /** 
    * @OneToMany(targetEntity="ProductFeatureVariant", mappedBy="productFeature") 
    */ 
    private $variants; 

    public function __construct() { 
     $this->variants = new ArrayCollection(); 
    } 
} 

/** @Entity */ 
class ProductFeatureVariant 
{ 
    /** @Column(type="integer") */ 
    private $id; 
    /** @Column(length=140) */ 
    private $name; 
    /** 
    * @ManyToOne(targetEntity="ProductFeature", inversedBy="variants") 
    * @JoinColumn(name="product_id", referencedColumnName="id") 
    */ 
    private $productFeature; 
} 

使用查詢生成器,您可以進行簡單的連接。

//select products with a certain color 
$qb = $this->entityManager->createQueryBuilder(); 
$qb 
    ->select('p') 
    ->from('Product', 'p') 
    ->leftJoin('p.features', 'f') 
    ->leftJoin('f.variants', 'v') 
    ->where('v.name = :color') 
    ->setParameter('color', $color); 
0

由於ProductFeaturesVariant已鏈接到產品屬性我會避免產品屬性表中的引用,以便這將是產品和ProductFeaturesVariant表之間只是一個多對多的關係。如果您曾經將ProductFeaturesVariant重新分配給其他功能,則您的三連接表格將變得不一致。