PHP Mapper Pattern, многие ко многим отношениям - PullRequest
4 голосов
/ 12 декабря 2011

При использовании шаблона сопоставления, что является наилучшей практикой для определения классов для отношений "многие ко многим".

Например, допустим, у нас есть таблицы для продуктов и категорий и категорий_категорий

Здесьнекоторые основные скелеты для продуктов и категорий.У каждого есть класс объекта, и у каждого есть Mapper.

Объект Product & Product 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) {}
}

Категория Object и Category Mapper

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 голос
/ 04 апреля 2012

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

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

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

$oProduct->addCategory( $oCategory );

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

$oProductMapper->save( $oProduct );
0 голосов
/ 21 декабря 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...