symfony + учение + наследование, как заставить их работать? - PullRequest
2 голосов
/ 05 мая 2010

Я начинаю работать с Symfony, я нашел некоторую документацию по наследованию. Но также нашел эту обескураживающую статью , которая заставляет меня усомниться в том, что Доктрина вообще справляется с наследством ...

Кто-нибудь нашел умное решение для наследования в Symfony + Doctrine?

В качестве примера, я уже структурировал базу данных примерно так:

CREATE TABLE `poster` (
  `poster_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(50) NOT NULL,
  PRIMARY KEY (`poster_id`),
  UNIQUE KEY `id` (`poster_id`),
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

CREATE TABLE `user` (
  `user_id` int(11) NOT NULL,
  `real_name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_id` (`user_id`),
  CONSTRAINT `user_fk` FOREIGN KEY (`user_id`) REFERENCES `poster` (`poster_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Исходя из этого, Doctrine сгенерировал этот "schema.yml":

Poster:
  connection: doctrine
  tableName: poster
  columns:
    poster_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    user_name:
      type: string(50)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
  relations:
    Post:
      local: poster_id
      foreign: poster_id
      type: many
    User:
      local: poster_id
      foreign: user_id
      type: many
    Version:
      local: poster_id
      foreign: poster_id
      type: many
User:
  connection: doctrine
  tableName: user
  columns:
    user_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: false
    real_name:
      type: string(50)
      fixed: false
      unsigned: false
      primary: false
      notnull: false
      autoincrement: false
  relations:
    Poster:
      local: user_id
      foreign: poster_id
      type: one

Создание пользователя для этой структуры с автоматически сгенерированными формами Doctrine не работает.

Любая подсказка будет оценена.

Ответы [ 2 ]

2 голосов
/ 14 мая 2010

После нескольких месяцев работы над проектом с использованием агрегации столбцов и конкретного наследования я могу сказать только одно: держитесь подальше от конкретного наследования! На самом деле.

Допустим, у вас есть 3 таблицы: Media и Video / Audio, которые наследуются от Media. Вы ожидаете, что сможете сделать что-то вроде:

Doctrine_Query::create()
    ->from('Media m')
    ->execute();

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

С другой стороны, при агрегации столбцов в таблицу Media будет автоматически добавлен столбец «type», который позволит вам выполнять такие действия, как:

Doctrine_Query::create()
    ->from('Video v')
    ->execute();

Который вернет коллекцию видео объектов. Но вы также можете сделать это:

Doctrine_Query::create()
    ->from('Media m')
    ->execute();

И вы получите смешанный результат видео и аудио объектов.

В любом случае вам следует проверить документацию к доктрине . Но будьте осторожны, так как наследование и доктрина могут быстро стать проблематичными.

0 голосов
/ 12 июля 2011

Решение для отделения данных «Видео» от, скажем, данных «Аудио», но для хранения «Медиа» по-прежнему используется та же таблица:

Media:
  columns:
    name: { type: string(255), notnull: true }
    description: { type: text }

Video:
  inheritance:
    type: column_aggregation
    keyField: type
    keyValue: video

Audio:
  inheritance:
    type: column_aggregation
    keyField: type
    keyValue: audio

VideoData:
  columns:
    resolution_x: { type: integer, notnull: true }
    resolution_y: { type: integer, notnull: true }
  relations:
    Video: { foreignAlias: Data, onDelete: CASCADE }

AudioData:
  columns:
    sample_rate: { type: integer, notnull: true }
  relations:
    Audio: { foreignAlias: Data, onDelete: CASCADE }

Что-то подобное ...может хранить все ваши «носители» в одной таблице и извлекать их, как упоминалось выше DuoSRX, и при этом не иметь в этой таблице ненужных данных.Конечно, вы должны присоединиться к нему, но с индексированными внешними ключами, которые вообще не должны снижать производительность.

...