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

4
使用映射器模式时,如何为多对多关系定义类的最佳实践是什么。
例如,假设我们有产品和类别以及产品_类别的表格。
以下是产品和类别的基本骨架。每个都有一个对象类和一个映射器。
产品对象和产品映射器:
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的新对象处理这些功能?非常感谢任何反馈。我认为两种方法都适用,但如果不创建新类,随着建立新关系,我也可以看到产品类变得臃肿。
2个回答

1
关于这个特定的问题:
“在Product_Mapper中创建名为“addCategory”、“deleteCategory”的方法是否违反了这种模式?”
是和不是。这与DataMapper无关。 这些应该被视为Product方法,例如:
$oProduct->addCategory( $oCategory );

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

$oProductMapper->save( $oProduct );

0

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

因此,用户使用CategoryProduct类,他们使用Mappers,如果您想要,Mapper可以使用一些公共类。

我不能确定所有这些,但似乎是合理的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接