Question

J'ai un cas de conception de base de données que je suis si curios Doctrine ORM supporte hors-box.


Produit :
colonnes :
id: {type: entier, primaire: true, autoincrement: true}
type_id: {type: entier, notnull: true}
brand_id: {type: entier, notnull: true}
relations :
ProductType:
Classe: ProductType
local: type_id
étranger: id
Marque:
Classe: Marque
local: brand_id
étranger: id

ProductType :
actAs :
I18n:
champs: {name}
colonnes :
id: {type: entier, primaire: true, autoincrement: true}
Nom: {type: string (255), notnull: true}

Marque :
actAs :
I18n:
champs: {name}
colonnes :
id: {type: entier, primaire: true, autoincrement: true}
Nom: {type: string (255), notnull: true}


Je veux slugify de table, à savoir. les produits seront atteints par leurs limaces. Cependant, comme vous voyez les deux tables de la marque et productype a un comportement i18n. Et d'ailleurs, ne marche pas produit ont un nom. sera la limace d'un produit: « Brand.name - ProductType.name », et varient selon la langue servi.

Pour ce scénario, est là de toute façon je peux utiliser le comportement Sluggable de Doctrine sluggify automatiquement mes produits. Ou dois-je gérer manuellement?

Par la façon dont ma configuration de l'environnement est:
Version Doctrine : 1.2
Symfony : 1.4.1

Merci

Était-ce utile?

La solution

Ma compréhension est que vous devez avoir la limace dans les deux modèles de type de produit et de marque. Vous pouvez laisser la définition du produit tel qu'il est. Quoi qu'il en soit, je suppose de votre question qu'il n'y a qu'un seul produit pour chaque type de marque + (même si elle n'a pas beaucoup de sens). Alors ProductType et marque seront définies comme suit:

schema.yml
----------

ProductType:
  actAs:
    I18n:
    fields: { name }
    actAs:
      Sluggable: { fields: [name], uniqueBy: [lang], canUpdate: true }
  columns:
    ...

Ensuite, vous devez configurer votre itinéraire de produit à utiliser les limaces. Et après que vous aurez besoin de configurer l'action pour vérifier ce que vous obtenez de la route.

Par exemple, cela pourrait être votre itinéraire pour les produits:

routing.yml
-----------

product:
  url:   /:sf_culture/product/:brand_slug/:type_slug
  param: { module: product, action: view }
  requirements:
    sf_culture: (?:en|fr)
    sf_method:  get

Ensuite, dans l'action que vous appellerez à vos propres findOneBySlugs (de brand_slug de $, type_slug de $) méthode:

product/actions/actions.class.php
---------------------------------

public function executeView(sfWebRequest $request)
{
  $product = Doctrine::getTable('Product')
    ->findOneBySlugs(
                     $request->getParameter('brand_slug'),
                     $request->getParameter('type_slug')
                    );

  $this->forward404Unless($product);
}

Autres conseils

le problème avec cette solution sont les requêtes. Avec:

$product = Doctrine::getTable('Product')
->findOneBySlugs(
                 $request->getParameter('brand_slug'),
                 $request->getParameter('type_slug')
                );

vous faites une requête 5 rejoindre si je ne me trompe pas. Vous pouvez améliorer à faire seulement trois (produit, brand_translation et producttype_translation)

Je suis dans une situation similaire, et la meilleure option est de créer une limace pour chaque produit en utilisant le nom du type marque ou un produit dans ce cas. Donc, vous n'aurez besoin:

$product = Doctrine::getTable('Product')
  ->findOneBySlug($request->getParameter('slug'));

Je pense entre deux options:

Product:
  actAs:
    Sluggable:
      unique: true
      fields: [title]
      builder: [Slug, slugify] 

ou en utilisant la fonction getUniqueSlug () de la classe d'enregistrement. Je pense que la première option est préférable que vous n'avez pas à vous soucier de l'unicité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top