Доктрина вялого поведения для международных отношений - PullRequest
1 голос
/ 26 января 2010

У меня есть пример дизайна базы данных, который меня интересует, поддерживает ли Doctrine ORM это из коробки.


Продукт
столбцы
id: {type: integer, primary: true, автоинкремент: true}
type_id: {type: integer, notnull: true}
brand_id: {тип: целое число, notnull: true}
отношения
ProductType:
Класс: ProductType
local: type_id
иностранный: id
Марка:
класс: марка
local: brand_id
иностранный: id

ProductType
ACTAS
I18n:
поля: {имя}
столбцы
id: {type: integer, primary: true, автоинкремент: true}
имя: {тип: строка (255), notnull: true}

Марка
ACTAS
I18n:
поля: {имя}
столбцы
id: {type: integer, primary: true, автоинкремент: true}
имя: {тип: строка (255), notnull: true}


Хочу зализать Таблицу продуктов, т.е. продукты будут достигнуты через их слизняков. Однако, как вы видите, таблицы как брендов, так и типов продуктов имеют поведение i18n. И более того, у продукта нет названия. Плагин продукта будет: «Brand.name - ProductType.name» и будет зависеть от используемого языка.

Для этого сценария, могу ли я в любом случае использовать Sluggable поведение Doctrine для автоматического замедления моих продуктов. Или я должен управлять им вручную?

Кстати, моя конфигурация среды:
Версия доктрины : 1.2
Symfony : 1.4.1

Спасибо

Ответы [ 2 ]

2 голосов
/ 29 января 2010

Насколько я понимаю, вам нужно иметь слизняк как в типе продукта, так и в модели бренда. Вы можете оставить определение продукта как есть. В любом случае, я предполагаю из вашего вопроса, что для каждого бренда + типа есть только один продукт (даже если это не имеет особого смысла). Поэтому ProductType и Brand будут определены следующим образом:

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

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

Затем вы должны настроить маршрут продукта для использования слагов. И после этого вам нужно будет настроить действие, чтобы проверить, что вы получаете от маршрута.

Например, это может быть ваш маршрут для продуктов:

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 голос
/ 17 февраля 2010

проблема с этим решением - запросы.С помощью:

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

вы делаете запрос с 5 объединениями, если я не ошибаюсь.Вы можете улучшить только три (product, brand_translation и producttype_translation)

Я нахожусь в аналогичной ситуации, и лучший вариант - создать слаг для каждого продукта, используя в этом случае название бренда или типа продукта,Так что вам понадобится только:

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

Я думаю о двух вариантах:

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

или использовании функции getUniqueSlug () в классе записи.Я думаю, что первый вариант лучше, так что вам не нужно беспокоиться об уникальности.

...