Symfony 1.4 embedRelation Нарушение ограничения целостности - PullRequest
0 голосов
/ 22 декабря 2010

Я нашел некоторую полезную информацию по этой проблеме, но не могу полностью обдумать решения.Поэтому я надеюсь, что кто-то может объяснить мне полезное решение, а не плагин / хак / обходной путь. Я очень стараюсь сделать «правильный» путь:

Так вот в чем моя проблема:

схема:

detect_relations: true    
Student:
  tableName: student
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    name:
      type: string(255)
      fixed: false
      unsigned: false
      primary: false
      default: ''
      notnull: true
      autoincrement: false
    parents_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      default: ''
      notnull: true
      autoincrement: false
   relations:
     Parents:
      refClass: StudentParentLink
      local: student_id
      foreign: parents_id
      onDelete: CASCADE
Parents:
  tableName: parents
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    name:
      type: string(255)
      fixed: false
      unsigned: false
      primary: false
      default: ''
      notnull: true
      autoincrement: false
    email_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      default: '0'
      notnull: true
      autoincrement: false
    relations:
      Student:
        refClass: StudetParentLink
        local: parents_id
        forign: student_id
        onDelete: CASCADE
Email:
  tableName: email
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    email:
      type: string(255)
      fixed: false
      unsigned: false
      primary: false
      default: ''
      notnull: true
      autoincrement: false
StudentParentLink:
  tableName: student_parent_link
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    student_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      default: '0'
      notnull: true
      autoincrement: false
    parents_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: false
      default: '0'
      notnull: true
      autoincrement: false

Итак, на английском у меня есть ученик, у которого есть родитель (ы), и у которого (ей) есть адрес электронной почты, достаточно просто.

Таким образом, в форме студента у меня есть следующее:

 //studentForm.class.php
 public function configure()
 {
     if($this->getObject()->isNew() || count($this->getObject()->Parents) == 0)
     {
         $this->getObject()->Parents[] = new Parents();
     }

     $parentsSubForm = new sfForm();
     $i = 1;
     foreach($this->getObject()->Parents as $parents)
     {
       $parentsForm = new ParentsForm($parents);
       $parentSubForm->embedForm("Parent $i",$parentsForm);
       $i++;
     }
  $this->embedForm('Parents',$parentSubForm)
 }

Это выглядит как ожидалось и работает для добавления записи студента, однако при обновлении я получаю ошибку:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2' for key 1

I 'я не уверен, что происходит только потому, что похоже, что он выполняет вставку, а не обновление для родителя, это так, как задумано?Мне просто нужно иметь возможность добавлять / редактировать электронную почту родителей (и все остальные данные, не перечисленные в этом примере для простоты) через форму студента

Как всегда, любые указания или комментарии приветствуются!Я только знакомлюсь с Symfony, и такие мелкие нюансы очень полезны для изучения, поэтому я могу двигаться вперед!

~ Mahalo Zjoia

UPDATE

Так что я здесь отчаянно и совершенно сбит с толку, я перепробовал все, что мог придумать и найти, и да, я могу устранить ошибку, но то, что неоднозначно в приведенной выше схеме, это то, что EMAIL - это «многие к одному», поэтомувыполнение действий, описанных в «Предварительных формах», не работает, вам нужно соотнести это по-другому, поэтому у меня есть следующий код:

 if($this->getObject()->isNew() || count($this->getObject()->Email) < 1)
 {
    $email = new Email($this->getObject()->Email);
    $emailForm = new EmailForm($email);
    $this->embedForm('Parents Email', $emailForm);
    $useFields[] = 'Parents Email';
 }else{
    $this->embedRelation('Email');
    $this->widgetSchema['Email']->setLabel('Parents Email');
    $useFields[] = 'Email';
 }

Это прекрасно работает, если я в родительской форме, но когда я вФорма для учащихся (которая включает в себя форму для родителей) не относится к электронной почте с родителем, она правильно создает сообщение электронной почты в email table, но не вставляет идентификатор электронной почты в parent table

Я собираюсьбез ума от этого я просто не понимаю, пожалуйста, помогите!

ИДИОТ

ОТВЕТ

Оказывается, у меня были некоторыестарые модели, которые связывали таблицы, которые я думал модel rebuild удалил бы получается не так уж много, убрал это, и вся эта сумасшедшая странность ушла, все работает отлично!

Всегда что-то глупое, что упускается

1 Ответ

0 голосов
/ 23 декабря 2010

Ваша проблема очень распространена и описана на сайте Symfony. Здесь является примером того, что вам нужно.

Также может быть полезна эта документация .«Особенно Глава 11 - Интеграция доктрины».

С уважением, Евгений

...