对外关系的主义可憎行为

时间:2010-01-26 16:56:06

标签: doctrine internationalization foreign-key-relationship slug

我有一个数据库设计案例,我很好奇Doctrine ORM是否支持它开箱即用。


产品

id:{type:integer,primary:true,autoincrement:true}
type_id:{type:integer,notnull:true}
brand_id:{type:integer,notnull:true}
关系
产品型号:
class:ProductType
local:type_id
外国人:id
品牌:
类:品牌
local:brand_id
外国人:id

ProductType
ACTAS
国际化:
字段:{name}

id:{type:integer,primary:true,autoincrement:true}
name:{type:string(255),notnull:true}

品牌
ACTAS
国际化:
字段:{name}

id:{type:integer,primary:true,autoincrement:true}
name:{type:string(255),notnull:true}


我想要淘汰Products表,即。产品将通过他们的slu to到达。但是,正如您所看到的那样,品牌和产品类型表都有i18n行为。此外,产品没有名称。产品的slug将是:“Brand.name - ProductType.name”,并且随所服务的语言而变化。

对于这种情况,无论如何我可以使用Doctrine的Sluggable行为来自动缓解我的产品。或者我必须手动管理吗?

顺便说一下我的环境配置是:
学说版本:1.2
Symfony :1.4.1

由于

2 个答案:

答案 0 :(得分:2)

我的理解是你需要在产品类型和品牌模型中都有slug。您可以保留产品定义。无论如何,我假设你的问题是每个品牌+类型只有一种产品(即使它没有多大意义)。所以ProductType和Brand将定义如下:

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

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

然后,您必须配置您的产品路线以使用slu ..之后,您需要配置操作以检查您从路线获得的内容。

例如,这可能是您的产品路线:

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

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

然后在动作中你会调用你自己的findOneBySlugs($ brand_slug,$ type_slug)方法:

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);
}

答案 1 :(得分:1)

该解决方案的问题是查询。用:

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

如果我没有弄错的话,你正在进行5连接查询。您可以改进只做三项(product,brand_translation和producttype_translation)

我处于类似的情况,最好的选择是在这种情况下使用品牌或产品类型名称为每个产品创建一个slug。所以你只需要:

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

我正在考虑两种选择:

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

或在记录类上使用getUniqueSlug()函数。我认为第一种选择是最好的,所以你不必担心唯一性。