2011-12-11 5 views
4

Lorsque vous utilisez le modèle de mappeur, quelle est la meilleure pratique pour définir des classes pour de nombreuses relations.PHP Mapper Pattern, plusieurs à plusieurs relations

Par exemple, disons que nous avons des tables pour les produits et les catégories et Product_Categories

Voici quelques squelettes de base pour les produits et catégories. Chacun a une classe d'objets et chacun a un Mappeur.

Produit Objet & Produit 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) {} 
} 

Catégorie Objet et Catégorie 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) {} 
} 

Ce qui manque ici est la possibilité d'ajouter des produits à des catégories et mise à jour/supprimer/select produits des catégories, etc.

Serait-ce aller contre ce modèle, pour créer une méthode dans Product_Mapper appelée addCategory, deleteCategory, getProductsByCategoryId ou voulez-vous créer un nouvel objet avec mapper appelé Product_Categories qui gérerait ces fonctions?

Vraiment apprécier vos commentaires. Je pouvais voir que l'une ou l'autre méthode était appropriée, mais sans créer une nouvelle classe, je pouvais aussi voir la classe de produits devenir gonflée au fur et à mesure que de nouvelles relations se construisaient.

Répondre

0

Je crois que l'idée du modèle DataMapper est de convertir le schéma de la base de données vers votre schéma interne. Vous pouvez donc oublier la troisième table de base de données qui relie les produits et les catégories. Par conséquent, vous devez créer des méthodes telles que Category_Mapper::getCategoriesByProductId et Product_Mapper::getProductByCategoryId. Donc, l'utilisateur utilise les classes Category et Product, ils utilisent des Mappeurs, et Mapper peut utiliser une classe commune si vous le souhaitez.

Je ne peux pas être sûr de tout cela mais cela semble raisonnable.

1

En ce qui concerne ce point particulier:

Serait-il aller à l'encontre de ce modèle, pour créer une des méthodes au sein Product_Mapper appelé "AddCategory", "deleteCategory",

Oui et non. Cela n'a vraiment rien à voir avec DataMapper. Ceux-ci devraient être considérés comme des méthodes de produit; par exemple:

$oProduct->addCategory($oCategory); 

Ensuite, lorsque vous enregistrez le produit avec le DataMapper, le DataMapper ajoutera la relation entre ce produit et cette catégorie que vous avez ajouté à elle.

$oProductMapper->save($oProduct); 
Questions connexes