Паттерн 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 методов с именем addCategory, deleteCategory, getProductsByCategoryId, или вы создадите новый объект с сопоставителем с именем Product_Categories, который будет обрабатывать эти функции?

Очень ценю любую обратную связь. Я мог видеть любой способ подходящим, но, не создавая новый класс, я мог также видеть, как класс продукта раздувается по мере построения новых отношений.


person dzm    schedule 11.12.2011    source источник


Ответы (2)


Относительно этого конкретного момента:

Будет ли противоречить этому шаблону создание методов в Product_Mapper под названием «addCategory», «deleteCategory»,

И да и нет. Это действительно не имеет ничего общего с DataMapper. Это следует рассматривать как методы продукта; например:

$oProduct->addCategory( $oCategory );

Затем, когда вы сохраняете продукт с помощью datamapper, datamapper добавит взаимосвязь между этим продуктом и той категорией, которую вы добавили к нему.

$oProductMapper->save( $oProduct );
person Rafa    schedule 04.04.2012

Я считаю, что идея шаблона DataMapper состоит в том, чтобы преобразовать схему БД в вашу внутреннюю схему. Таким образом, вы можете забыть о третьей таблице базы данных, которая связывает товары и категории. Таким образом, вы должны создать такие методы, как Category_Mapper::getCategoriesByProductId и Product_Mapper::getProductByCategoryId.

Итак, пользователь использует классы Category и Product, они используют Mappers, а Mapper может использовать какой-нибудь общий класс, если хотите.

Я не могу быть уверенным во всем этом, но это кажется разумным.

person Vadim Pushtaev    schedule 21.12.2011