2017-08-03 45 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 
{}