PHP Mapper模式,多对多的关系

在使用映射器模式时,为多对多关系定义类的最佳做法是什么。

例如,假设我们有产品和类别以及Product_Categories的表格

以下是产品和类别的一些基本框架。 每个对象都有一个对象类,每个对象都有一个Mapper。

产品对象和产品映射器:

class Product
{
    public $product_id;
    public $name;

    public function __construct($product_id = false, $name = false)
    {
        $this->product_id = $product_id;
        $this->name = $name;
    }
}

class Product_Mapper
{
    private $_db;

    public function __construct($_db) {}

    public function getProducts() {}
    public function getProductById($product_id) {}
    public function insert(Product $product) {}
    public function save(Product $product) {}
    public function update(Product $product) {}
    public function delete(Product $product) {}
}

类别对象和类别映射器

class Category
{
    public $category_id;
    public $name;

    public function __construct($category_id = false, $name = false)
    {
        $this->category_id = $category_id;
        $this->name = $name;
    }
}

class Category_Mapper
{
    private $_db;

    public function __construct($_db) {}

    public function getCategories() {}
    public function getCategoryById($product_id) {}
    public function insert(Category $category) {}
    public function save(Category $category) {}
    public function update(Category $category) {}
    public function delete(Category $category) {}
}

这里缺少的是将产品添加到类别以及更新/删除/从类别等选择产品的能力。

是否会违背这种模式,在Product_Mapper内创建一个名为addCategorydeleteCategorygetProductsByCategoryId的方法,或者是否会创建一个名为Product_Categories映射器来处理这些函数的新对象?

真的很感谢任何反馈。 我可以看到任何一种方式都是合适的,但是如果没有创建新的类,我也可以看到随着新关系的建立,产品类变得臃肿。


关于这一点:

是否会违背这种模式,在Product_Mapper中创建一个名为“addCategory”,“deleteCategory”的方法,

是,不是。 它确实与DataMapper无关。 这些应该被视为产品方法; 例如:

$oProduct->addCategory( $oCategory );

然后,当您使用数据映射器保存产品时,数据映射器将添加该产品与添加到其中的类别之间的关系。

$oProductMapper->save( $oProduct );

我相信DataMapper模式的想法是将数据库的模式转换为内部模式。 所以你可以忘记连接产品和类别的第三个数据库表。 因此您应该创建类似于Category_Mapper::getCategoriesByProductIdProduct_Mapper::getProductByCategoryId

因此,用户使用CategoryProduct类,他们使用Mappers,而Mapper可以使用一些常用的类。

我无法确定这一切,但似乎是合理的。

链接地址: http://www.djcxy.com/p/56251.html

上一篇: PHP Mapper Pattern, many to many relationships

下一篇: Data Mapper: An domain object should never call its data mapper?