LINUX.ORG.RU

Удалить объект

 , ,


0

1

Symphony вижу первый день в жизни. На ней сделан раздел вебинаров и пристегнутый к нашему проекту. Разработчики этого чуда забросили его и исчезли. Мне выпала почетная обязанность кое-что поправить. В процессе всплыла бага. Оказывается вебинар, если к нему прикручен чат не удаляется. Если бы это чудо могло сообщать об ошибках оно бы вывалило что-то вроде:

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`autowebinar`.`chat_settings`, CONSTRAINT `chat_settings_webinar_id_webinar_id` FOREIGN KEY (`webinar_id`) REFERENCES `webinar` (`id`))
По этой фигне гуглится что для симфони необходимо указать для этого поля атрибут onDelete: CASCADE. Порылся в yml файлах но не понял к чему это должно относится. Что найти в схеме и куда дописать. И будет ли эффект если я припишу к этому, к чему это должно относится атрибут сейчас или надо будет пересоздать базу. А какие еще есть способы разрешения траблы?

★★★★★

Почитать про foreign key сложно? В мануалах баз данных это всё описано.

В двух словах: если сущность X ссылается через foreign key на сущность Y и у неё есть constraint, то при попытке удалить сущность Y, когда на неё все ещё ссылается несколько X и вызовет такую ошибку. Чтобы устранить ошибку надо:

1. Открыть транзакцию.
2. Удалить сущности X, которые ссылаются на удаляемую Y.
3. Удалить саму сущность Y, которую хотим удалить.
4. Сделать commit или rollback транзакции в зависимости от ситуации.

А так да, читай про ON DELETE CASCADE, ON DELETE RESTRICT и ON DELETE SET NULL.

resurtm ★★★
()

Symphony → Symfony.

Есть Symphony CMS, есть Symfony Web Framework. Два, абсолютно разных проекта. Это как спутать Sphinx Search и Sphinx Doc. =)

resurtm ★★★
()
Последнее исправление: resurtm (всего исправлений: 1)
Ответ на: комментарий от pi11

По моему личному опыту когда как и везде по-разному. В некоторых фреймворках да, это автоматизируется на стороне фреймворка, а в некоторых на стороне самой базы данных.

Тот-же Oracle ADF так вообще рекомендует всю логику приложения хранить на стороне БД. Включая и каскадное удаление.

resurtm ★★★
()
Ответ на: комментарий от resurtm

Да причем же тут база? Что такое foreign key я знаю. Речь не о том как это удалить это из базы. Речь о том как сделать это в модели данных Symfony.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от resurtm

Symphony → Symfony

А я и не знал. Сорри, затупил. Просто не сталкивался ни с тем ни с другим, а тегах автокомплит подсказал Symphony вот и сбил.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от pi11

Вот у фреймворка и есть специально заточенный костыль для этого, а как им воспользоваться я не соображу.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Речь о том как сделать это в модели данных Symfony.

Укажи, пожалуйста, версию Symfony, название используемой ORM и её версию. Symfony первой ветки и Symfony2 абсолютно разные фреймворки. ORM из Symfony тоже имеют 3 варианта: Propel (использоваться может как с Symfony, так и с Symfony2), Doctrine (Symfony только первой ветки) и Doctrine2 (только Symfony2).

resurtm ★★★
()
Последнее исправление: resurtm (всего исправлений: 2)
Ответ на: комментарий от Suntechnic

Первая ветка. Doctrine.

Ух, сорри. Тогда не помогу. Думал, что в твоём проблемном проекте Symfony2 и Doctrine2 (которые очень популярны). С первой веткой вообще не работал. Ждём ещё кого-нибудь. :(

resurtm ★★★
()
Последнее исправление: resurtm (всего исправлений: 1)
Ответ на: комментарий от resurtm

Да, я заметил что в сети в основном по Symfony2 материалы... :(

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от goingUp

Базу можно не пересоздавать

уже хоршо

Указать надо в schema.yml

Это я понял. Но вот в каком именно из over9000? Как найти его?

Мне так показалось что это должен быть config/doctrine/chat.schema.yml у которого такое содержание:

ChatMessage:
  actAs:
    Timestampable:
      updated: { disabled: true }
  columns:
    message:
      type: string
      notnull: 255
    affiliate_id: integer
    webinar_id: integer
  relations:
    Author:
      class: WebinarAffiliate
      foreignAlias: Messages
      local: affiliate_id
      foreign: id
      onDelete: CASCADE
    Webinar:
      class: Webinar
      foreignAlias: Messages
      local: webinar_id
      foreign: id
      onDelete: CASCADE

ChatSettings:
  columns:
    webinar_id: { type: integer, notnull: true }
    names_list: array
    names_count: { type: integer, notnull: true }
    join_rate: { type: integer, notnull: true }
    leave_rate: { type: integer, notnull: true }
  relations:
    Webinar:
      local: webinar_id
      foreign: id
      type: one
      foreignType: one
И я вот прямо в конец, т.е. в ChatSettings: - relations: - Webinar: добавляю onDelete: CASCADE но обламываюсь (

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от goingUp

И это не костыль, а abstraction level

Ну на мой взгляд любой стопитцотый abstraction level это уже костыль. Но я плотно на упорине, так что можно не обращать внимания ;)

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от goingUp

А это просто ничего не дает. Картина та же самая. Т.е. я не знаю что еще добавить. Та же ошибка.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от goingUp

Во-первых я как-то рассчитывал на abstraction level. Но главное не в этом, а в том что нет такой таблицы ChatSettings. Я вообще не могу сообразить как ChatSettings превращается в chat_settings и почему.

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Однако переписанный запрос с правильными именами таблиц помог.

СПАСИБО!

Кстати, дропать не понадобилось ;)

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Во-первых я как-то рассчитывал на abstraction level

Нужно запустить команду, чтобы создать миграцию и еще одну, чтобы ее запустить. Но я ее не помню)

Я вообще не могу сообразить как ChatSettings превращается в chat_settings и почему.

Для php кода чаще используется стиль именования классов ChatSettings, для таблиц БД chat_settings.

goingUp ★★★★★
()
Ответ на: комментарий от goingUp

Для php кода чаще используется стиль именования классов ChatSettings, для таблиц БД chat_settings.

Насколько я понял symfony создает таблица по yml файлу так почему она читает там ChatSettings а создает chat_settings? Или я чего-то не догоняю?

Suntechnic ★★★★★
() автор топика
Ответ на: комментарий от Suntechnic

Symfony поддерживает два ORM: Doctrine и Propel. Я дал тебе доку по Propel (сори :), для него так и было бы, для доктрины видимо чуть иначе.

goingUp ★★★★★
()
Ответ на: комментарий от goingUp

Чего за «сорри» такое? Помог же. Трабла решена. Заказчик доволен. Говорит что разрабы этого чуда когда случалось такое говорили ща поправим что-то делали (удаляли зависимую запись руками) и все удалялось. ;)

Suntechnic ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.