При создании базы данных Doctrine создается нераспознанная таблица - PullRequest
2 голосов
/ 28 января 2011

У меня есть следующий schema.yml

Proposition:
  actAs: { Timestampable: ~ }
  columns:
    name: { type: string(255), notnull: true }
    slug: { type: string(255), notnull: true, unique: true }
    proposition_type_id: { type: integer, notnull: true }
    icon: { type: string(255) }
    overview: { type: string(4000) }
    features: { type: string(4000) }
    benefits: { type: string(4000) }
    published: { type: boolean, notnull: true, default: 1 }
  relations:
    PropositionType: { onDelete: CASCADE, local: proposition_type_id, foreign: id }
    Products:
      class: Product
      refClass: PropositionProduct
      local: proposition_id
      foreign: product_id
      foreignAlias: PropositionProducts

PropositionType:
  columns:
    name: { type: string(255), notnull: true }

Review:
  actAs: { Timestampable: ~ }
  columns:
    proposition_id: { type: integer, notnull: true }
    review: { type: string(4000), notnull: true }
    name: { type: string(255), notnull: true }
    company: { type: string(255) }
    published: { type: boolean, notnull: true, default: 1 }
  relations:
    Proposition: { onDelete: CASCADE, local: proposition_id, foreign: id }

PropositionProduct:
  columns:
    proposition_id: { type: integer, primary: true }
    product_id: { type: integer, primary: true }
  relations:
    Proposition: { onDelete: CASCADE, local: proposition_id, foreign: id }
    Product: { onDelete: CASCADE, local: product_id, foreign: id }

Product:
  actAs: { Timestampable: ~ }
  columns:
    name: { type: string(255), notnull: true }
    slug: { type: string(255), notnull: true, unique: true }
    icon: { type: string(255) }
    ataglance: { type: string(4000) }
    idealfor: { type: string(4000) }
    details: { type: string(4000) }
    specsheet: { type: string(255) }
    chart: { type: string(255) }
    published: { type: boolean, notnull: true, default: 1 }
  relations:
    RelatedProducts:
      class: Product
      refClass: RelatedProduct
      local: product_id
      foreign: related_product_id
      foreignAlias: RelatedProducts

RelatedProduct:
  columns:
    product_id: { type: integer, primary: true }
    related_product_id: { type: integer, primary: true }
  relations:
    Product: { onDelete: CASCADE, local: product_id, foreign: id }
    Product: { onDelete: CASCADE, local: related_product_id, foreign: id }

Segment:
  actAs: { Timestampable: ~ }
  columns:
    name: { type: string(255), notnull: true }
    slug: { type: string(255), notnull: true, unique: true }
    published: { type: boolean, notnull: true, default: 1 }
  relations:
    Products:
      class: Product
      refClass: SegmentProduct
      local: segment_id
      foreign: product_id
      foreignAlias: SegmentProducts

SegmentProduct:
  columns:
    segment_id: { type: integer, primary: true }
    product_id: { type: integer, primary: true }
  relations:
    Segment: { onDelete: CASCADE, local: segment_id, foreign: id }
    Product: { onDelete: CASCADE, local: product_id, foreign: id }

Я запустил:

php symfony doctrine:build --all --and-load --no-confirmation

, и база данных была успешно построена.

Но почему proposition_segment таблица была создана?

CREATE TABLE `proposition_segment` (
  `segment_id` bigint(20) NOT NULL DEFAULT '0',
  `product_id` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`segment_id`,`product_id`),
  KEY `proposition_segment_product_id_product_id` (`product_id`),
  CONSTRAINT `proposition_segment_product_id_product_id` FOREIGN KEY (`product_id`) REFERENCES `product` (`id`) ON DELETE CASCADE,
  CONSTRAINT `proposition_segment_segment_id_segment_id` FOREIGN KEY (`segment_id`) REFERENCES `segment` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Насколько я понимаю, моя схема должна детализировать, что Segment и Product имеют отношение многие ко многим через таблицу SegmentProduct.

Аналогично,Proposition и Product имеют отношение многие ко многим через таблицу PropositionProduct.

Я не могу понять, почему Doctrine создает таблицу proposition_segment.Кроме этого, база данных выглядит правильно - она ​​создает таблицы proposition_product и segment_product, как и ожидалось.

Когда я добавляю данные через серверную часть, сгенерированную Symfony, таблица proposition_segment остается пустой, что увеличивает мои подозрениячто он создан по ошибке.

1 Ответ

0 голосов
/ 31 января 2011

Спасибо за ссылки greg0ire, поиграв с ним в течение нескольких часов этим утром, я решил создать новый пустой проект Symfony и загрузить в него мой файл sche.yml После создания я получаю желаемую структуру базы данных! Так получается, что схема на самом деле правильная и где-то должен быть класс формы, который генерирует дополнительные таблицы? Я сделаю еще кое-что, чтобы выяснить, что происходит. Я также изменил псевдоним и создал равные отношения гнезд на основе ваших рекомендаций - спасибо.

EDIT:

Бинго! Я нашел некоторые классы в lib / model /, которые не были нужны, приведение в порядок этой папки исправило создание дополнительных таблиц. Я, хотя Doctrine читает только из файла config / doctrine / sche.yml, но я думаю, что он также читает ваши модели? - Конечно, потому что во всех примерах показаны два разных способа создания классов. Я до сих пор не совсем уверен, когда были созданы эти файлы, но теперь я буду следить за моими моделями.

...