Доктрина - Несколько моделей ссылаются на одно и то же поле идентификатора в другой модели - PullRequest
9 голосов
/ 19 мая 2010

У меня есть Файловая модель и несколько (в настоящее время 3) различных других моделей (Статья, Работа, Событие), которые могут иметь файлы, которые хранятся в Файловой модели.

Проблема в том, что когда я генерирую таблицы с помощью CLI-Tool (./doctrine build-all-reload), я получаю это сообщение об ошибке:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot 
add or update a child row: a foreign key constraint fails 
(`my_database/articles`, CONSTRAINT `articles_id_files_target_id`
FOREIGN KEY (`id`) REFERENCES `files` (`target_id`))

Файл определен как (В этой модели не определены отношения):

columns:
  id:
    primary: true
    autoincrement: true
    type: integer(4)
  target_id: integer(4)
  filename: string(255)
[...]

Все 4 модели имеют это определение отношения:

  relations:
    Files:
      type: many
      class: File
      local: id
      foreign: target_id

Это Php-код, который генерирует Doctrine (BaseFile.php):

public function setUp()
{
    parent::setUp();
    $this->hasOne('Publication', array(
         'local' => 'target_id',
         'foreign' => 'id'));

    $this->hasOne('Event', array(
         'local' => 'target_id',
         'foreign' => 'id'));

    $this->hasOne('Article', array(
         'local' => 'target_id',
         'foreign' => 'id'));

    $this->hasOne('Job', array(
         'local' => 'target_id',
         'foreign' => 'id'));
}

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

Есть ли способ сказать Доктрине, что она не должна создавать отношения в модели Файла?

Есть хорошие идеи?

Ответы [ 2 ]

0 голосов
/ 02 мая 2011

Вы можете попробовать что-то вроде:

columns:
    id: { type: integer(4), notnull: true, primary: true, autoincrement: true }
    target_id:  { type: integer(4), notnull: true }
    model:       { type: string, notnull: true }

Файлам модели нужно знать идентификатор и модель связанной записи.Итак, в Files.class.php вы также можете указать:

public function getArticles() {
    if (strcmp($this->getModel(), 'Articles')) {
        return Doctrine::getTable('Articles')->findOneById($this->getTargetId());
    } else {
        return false;
    }
}

Возможно, есть лучший способ, но в этом случае у вас есть 1 таблица, вам не нужно больше отношений, но вы должныукажите получатели / установщики самостоятельно.Так что это зависит от ваших целей, будет ли это пихать или нет.

0 голосов
/ 20 апреля 2011

попробуйте, если нужно,
Отношения:

Files:
  type: many
  class: File
  local: target_id
  foreign: id
Files2:
  type: many
  class: File
  local: id
  foreign: id
...