Сохранение родительского / дочернего заголовка / строки с помощью Doctrine 1.2 - PullRequest
0 голосов
/ 20 июля 2010

У меня есть простая модель parent-child / header-line в моем проекте.Проблема в том, что он создает циклические отношения или что-то, и не позволяет мне сохранить родителя без ребенка!Обнаружение отношений отключено!

detect_relations: false
...
BillHeader:
  package: Billing
  tableName: Bill_Headers
  actAs:
    SoftDelete: ~
  columns:
    id:
      type: integer(8)
      primary: true
      notnull: true
      autoincrement: true
    ....

BillLine:
  package: Billing
  tableName: Bill_Lines
  actAs:
    SoftDelete: ~
  columns:
    id:
      type: integer(8)
      primary: true
      notnull: true
      autoincrement: true
    bill_header_id:
      type: integer(8)
      notnull: true
  relations:
    Bill_Header:
      class: BillHeader
      local: bill_header_id
      foreign: id
      foreignAlias: Bill_Lines
      type: one
  1. при первом сохранении родителя: $billHeader->save(); выдает ошибку: SQLSTATE [HY000]: общая ошибка: 1452 Не удаетсядобавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено (sokidb. bill_headers, CONSTRAINT Bill_Headers_id_Bill_Lines_bill_header_id FOREIGN KEY (id) ССЫЛКИ bill_lines (bill_header_id))

  2. , когда я $billHeader->Bill_Lines[] = $billLine; выдает ошибку: Добавление не поддерживается для BillLine

  3. Строка не будет сохранена без родителя, поэтому я даже не могу сделать $billHeader->link('Bill_Lines', $billLines);

  4. $billHeader->Bill_Lines = $billLines; выдает ошибку Не удалось вызвать Doctrine_Core:: set (), второй аргумент должен быть экземпляром Doctrine_Collection при установке ссылок «один ко многим».

  5. Если я отбрасываю связь, сделайте $billHeader->save();, тогда $billHeader->id возвращается пустым.Так что это тоже не работает!

Интересно, есть ли 6-й способ сделать это ???: (

Я устал думать об этой проблеме, кажется, что нет никакого решения. Почти 3 дня на это, и теперь подсказка! Это приводит меня к самоубийству! Почему это поведение? Поможет ли, если столMyIsam вместо InnoDB?

Любая помощь по этому вопросу высоко ценится! Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 20 июля 2010

Что-то не так с вашей схемой.Ограничение:

CONSTRAINT Bill_Headers_id_Bill_Lines_bill_header_id  FOREIGN KEY (id) REFERENCES bill_lines (bill_header_id))

Не должно существовать.Идентификатор BillHeader не должен быть внешним ключом BillLine.Вместо этого должно быть ограничение от BillLine к BillHeader, что-то вроде:

CONSTRAINT `Bill_Lines_header_id_Bill_Header_id` FOREIGN KEY (`bill_header_id`) REFERENCES `Bill_Header` (`id`)

У вас есть определенные отношения, определенные в BillHeader, которые могут добавлять это ограничение?В любом случае, ключевым моментом здесь является игра с вашей схемой, пока ограничение не пойдет в правильном направлении.

0 голосов
/ 29 июля 2010

Я решил это после большого самоанализа.Один из объявленных атрибутов был помечен как ПЕРВИЧНЫЙ.Не знаю, почему этот результат, но это была проблема!

...