2011-11-18 1 views
0

Цель: при удалении пользователя все записи для пользователя в пользовательской категории также должны быть удалены.Symfony 1.4 Справка схемы схемы Doctrine, необходимая для разрешения нарушения ограничений целостности

Схема:

User: 
    actAs: { Timestampable: ~ } 
    columns: 
    first_name: { type: string(255) } 
    name: { type: string(255) } 
    company: { type: string(255) } 
    email: { type: string(255) } 
    phone: { type: string(255) } 
    language_id: { type: integer, notnull: true } 
    token: { type: string(255) } 
    activated: { type: boolean, default: false } 
    relations: 
    Categories: 
     class: Category 
     local: user_id 
     foreign: category_id 
     refClass: UserCategory 
     type: many 

UserCategory: 
    actAs: { Timestampable: ~ } 
    columns: 
    user_id: { type: integer, notnull: true } 
    category_id:  { type: integer, notnull: true } 

Category: 
    actAs: { Timestampable: ~ } 
    columns: 
    language_id: { type: integer, notnull: true } 
    name: { type: string(255), notnull: true, unique: false } 
    revision: { type: integer, notnull: false } 
    icon:  { type: string(255) } 
    relations: 
    User: 
     class: User 
     local: category_id 
     foreign: user_id 
     refClass: UserCategory 
     type: many 

Что происходит:

SQLSTATE [23000]: Integrity нарушение ограничения: 1451 Невозможно удалить или обновить родительскую строку:. Ограничение внешнего ключа не удается (testtableuser_category , КОНСТРАИРОВАНИЕ user_category_user_id_user_id ИНОСТРАННЫЙ КЛЮЧ (user_id) ССЫЛКИ user (id))

ответ

2

Как greg0ire said, определяющий каскад для UserCategory, выполнил эту работу. Он полностью пропустил блок отношений:

UserCategory: 
    actAs: { Timestampable: ~ } 
    columns: 
    user_id: { type: integer, notnull: true } 
    category_id:  { type: integer, notnull: true } 
    relations: 
    User: {onDelete: CASCADE, local: user_id, foreign: id, foreignAlias: Users} 
    Category: {onDelete: CASCADE, local: category_id, foreign: id, foreignAlias: Categories} 
+1

Вы используете каскады уровня базы данных, что является самым быстрым решением. +1 – greg0ire

1

Прочитайте это § of the doctrine documentation и выбрать решение, которое подходит вам лучше всего между прикладным уровнем-каскадами и уровнем базы данных-каскадами

+0

Удалить CASCADE здесь не вариант, только записи в user_category необходимо удалить, а не в категории. Так что это скорее запрос справки для отладки YML. –

+1

О, я вижу. Но определение отношения к 'User' в' UserCategory' и использование каскада сделало бы работу, я предполагаю. – greg0ire

1

Вы должны определить операцию каскадной на ваши отношениях. См. Статью Foreign Key's onDelete for dummies (не только для чайников) с примером для доктрины.