Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP映射器模式,多对多关系_Php_Oop_Datamapper - Fatal编程技术网

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

PHP映射器模式,多对多关系,php,oop,datamapper,Php,Oop,Datamapper,使用映射器模式时,为多对多关系定义类的最佳实践是什么 例如,假设我们有产品和类别以及产品类别的表格 以下是一些产品和类别的基本框架。每个都有一个对象类和一个映射器 产品对象和产品映射器: class Product { public $product_id; public $name; public function __construct($product_id = false, $name = false) { $this->produ

使用映射器模式时,为多对多关系定义类的最佳实践是什么

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

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

产品对象和产品映射器:

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\u Mapper
中创建名为
addCategory
deletegory
getProductsByCategoryId
的方法是否会违反此模式,或者您会使用名为
Product\u Categories
的Mapper创建一个处理这些函数的新对象


非常感谢您的反馈。我可以看到任何一种方法都是合适的,但在不创建新类的情况下,我也可以看到产品类随着新关系的建立而变得臃肿。

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

所以,用户使用
Category
Product
类,他们使用映射器,如果需要,映射器可以使用一些公共类


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

关于这一点:

在产品映射器中创建一个名为“addCategory”、“deleteCategory”的方法是否会违反这种模式

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

$oProduct->addCategory( $oCategory );
然后,当您使用datamapper保存产品时,datamapper将添加该产品与您添加到其中的类别之间的关系

$oProductMapper->save( $oProduct );