PHP映射器模式,多对多关系


PHP Mapper Pattern, many to many relationships

在使用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中创建一个名为addCategory, deleteCategory, getProductsByCategoryId的方法,或者创建一个名为Product_Categories的映射器的新对象来处理这些函数,会违背这种模式吗?

非常感谢任何反馈。我认为这两种方法都是合适的,但如果不创建新类,我还会看到随着新关系的建立,产品类会变得臃肿。

关于这一点:

在Product_Mapper中创建一个名为"addCategory","deleteCategory",

的方法是否与此模式相反?

是,也不是。它与DataMapper没有任何关系。这些应被视为产品方法;如:

$oProduct->addCategory( $oCategory );

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

$oProductMapper->save( $oProduct );

我认为DataMapper模式的思想是将DB的模式转换为您的内部模式。因此,可以忽略连接产品和类别的第三个数据库表。因此,您应该创建Category_Mapper::getCategoriesByProductIdProduct_Mapper::getProductByCategoryId这样的方法。

所以,用户使用CategoryProduct类,他们使用映射器,如果你想,映射器可以使用一些常见的类。

我不能肯定这一切,但它似乎是合理的。