我有界面:
interface Product
{
function getAmount();
}
和php doctine实体:
/**
* @ORM\Table(name="orders")
* @ORM\Entity
*/
class Order
{
private $products = array();
public function addProduct(Product $product){
$this->products[] = $product;
}
public function getProducts() {
return $this->products;
}
function getAmount() {
$amount = 0;
foreach ($this->products as $product) {
$amount += $product->getAmount();
}
return $amount;
}
}
/**
* @ORM\Table(name="books")
* @ORM\Entity
*/
class Book implements Product
{
function getAmount() {
return 1;
}
}
/**
* @ORM\Table(name="pens")
* @ORM\Entity
*/
class Pen implements Product
{
function getAmount()
{
return 2;
}
}
Book,Pen - 是不同的实体和表格。如何实现Order :: products与Books,Pen等集合的关系(用于保存在数据库中)?
我理解这个问题的两个解决方案。 第一种是在保存(和加载)到数据库时手动将此关系转换为map(实体名称和ID的数组)。 这个决定我不喜欢。 第二是纠正架构。我不知道怎么。很可能已经有了现成的解决方案......请帮助。
答案 0 :(得分:0)
我不确定你是否可以这样做。
您是否定义了一个单独的实体产品,并添加了一个 product_type 列,您可以在其中判断它是书,笔还是其他内容。
在实体产品中,该属性应定义为枚举,并且它可能很棘手(取决于除了原则之外你使用了什么)
或者你为每种产品类型制作它(噩梦可以很快)。我猜你有ManyToMany Relation。最有可能它应该看起来像smth。那样的。
按顺序
/**
* @ManyToMany(targetEntity="Book")
* @JoinTable(name="Order_Book",
* joinColumns={@JoinColumn(name="book_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="order_id", referencedColumnName="id")}
* )
*/
protected $book;
/**
* @ManyToMany(targetEntity="Pen")
* @JoinTable(name="Order_Pen",
* joinColumns={@JoinColumn(name="pen_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="order_id", referencedColumnName="id")}
* )
*/
protected $pen;
并在书中:
/*
* @ManyToMany(targetEntity="Order", mappedBy="book")
*/
protected $order;
用Pen和其他人一样的方式。
答案 1 :(得分:0)