php doctrine保存不同实体的集合

时间:2014-04-06 16:44:20

标签: php doctrine-orm doctrine

我有界面:

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的数组)。 这个决定我不喜欢。 第二是纠正架构。我不知道怎么。很可能已经有了现成的解决方案......请帮助。

2 个答案:

答案 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)