доктрина, Symfony 1.4: как мне исправить это «нарушение ограничения целостности» - PullRequest
0 голосов
/ 27 сентября 2011

Я определил эту сущность в schema.yml

Jobsearch:
  tableName: jobsearch
  columns:
    seeker_id:
      primary: true
      type: integer
      notnull: true
      autoincrement: false
    empmode:
      type: string(50)
    pensum:
      type: integer
    active:
      type: boolean
  relations:
    Privateaccount:
      local: seeker_id
      foreign: id
      alias: seeker

имеет внешнюю ссылку на

Privateaccount:
  tableName: privateaccount
  columns:
    id:
      primary: true
      unique: true
      type: integer
      notnull: true
      autoincrement: true
    firstname:
      type: string(255)
    lastname:
      type: string(255)
  inheritance:
    extends: sfGuardUser
    type: column_aggregation
    keyField: type
    keyValue: Privateaccount

Я выполнил действие symfony для тестирования, он должен сохранить Jobsearch в db:

 public function executeTest(sfWebRequest $request)
  {
   $test = new Jobsearch();
   $test->setSeeker( $this->getUser()->getGuardUser() ) ; // set the user that is logged in    
   $test->save();
  }

$test->save() приводит к этой ошибке:

SQLSTATE [23000]: нарушение ограничения целостности: 1451 Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполнено (test2. sf_guard_user_profile, ОГРАНИЧЕНИЕ sf_guard_user_profile_user_id_sf_guard_user_id ИНОСТРАННЫЙ КЛЮЧ (user_id) ССЫЛКИ sf_guard_user (id) НА УДАЛЕННОМ КАСКАДЕ)

Я не понимаю, почему ограничение внешнего ключа не выполняется.

Что вызвало ошибку?

РЕДАКТИРОВАТЬ: Если я изменить primary на false в seeker_id, это работает. Но я хочу, чтобы внешний ключ был первичным ключом. Если возможно, как мне заставить это работать?

1 Ответ

0 голосов
/ 30 сентября 2011

Попробуйте изменить schema.yml на

Jobsearch:
  tableName: jobsearch
  columns:
    seeker_id:
      primary: true
      type: integer
      notnull: true
      autoincrement: false
    empmode:
      type: string(50)
    pensum:
      type: integer
    active:
      type: boolean
  relations:
    Seeker:
      class: Privateaccount
      local: seeker_id

и

Privateaccount:
  tableName: privateaccount
  columns:
    firstname:
      type: string(255)
    lastname:
      type: string(255)
  inheritance:
    extends: sfGuardUser
    type: column_aggregation
    keyField: type
    keyValue: Privateaccount

Doctrine создает поле id по умолчанию. Не объявляй это.

Наконец-то должно получиться.

 public function executeTest(sfWebRequest $request)
  {
   $test = new Jobsearch();
   $test->setSeekerId( $this->getUser()->getGuardUser()->getId() ) ; // set the user that is logged in    
   $test->save();
  }
...