2017-08-03 42 views
2

我该怎么办?我需要建立打印机,碳粉,墨盒和墨水之间的学说联系。一台打印机可以使用其中一种{碳粉,胶带,墨水}。学说PHP协会symfony3

但我不知道什么是最好的方式来做到这一点。我想尽可能使用最佳实践(OOP)。

enter image description here

+0

听起来像是你将需要一个交叉引用/外部参照表?这是你的想法吗? – ficuscr

+0

是的,我认为在类似的东西,但我不太确定如何做到这一点。我应该为此实现一个接口吗? – onBassTaiji

+0

因此,如果'type_of_consumable_id'是一个FK,你怎么知道什么表?似乎你缺乏背景。 'type_of_consumable_type'或其他...... – ficuscr

回答

0

Doctrine2支持inheritance mapping - 您可以使用它:

/** 
* @ORM\Table 
* @ORM\Entity 
*/ 
class Printer 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\OneToOne(targetEntity="Consumable") 
    */ 
    private $consumable; 
} 

/** 
* @ORM\Entity 
* @ORM\InheritanceType("SINGLE_TABLE") 
* @ORM\DiscriminatorColumn(name="discr", type="string") 
* @ORM\DiscriminatorMap({"toner" = "Toner", "ink" = "Ink"}) 
*/ 
abstract class Consumable 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="created_at", type="datetime") 
    */ 
    private $createdAt; 


    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="updated_at", type="datetime") 
    */ 
    private $updatedAt; 
} 


/** 
* @ORM\Entity 
*/ 
final class Toner extends Consumable 
{} 

/** 
* @ORM\Entity 
*/ 
final class Ink extends Consumable 
{}