Вадим
Вроде да
ну верно, 2 запроса сгенерит ORM, чтобы удалить сперва b потом a это такой программный onDelete CASCADE
Viktor
ещё надо бы узнать в каком порядке он удаляет сирот и родителя. Хотя если он делает это в одной транзакции то это не важно. Или важно
Тут же, вроде, если orphanRemoval true, то удалять в коде сирот вообще не надо. Просто родителя удаляешь и все
Вадим
ещё надо бы узнать в каком порядке он удаляет сирот и родителя. Хотя если он делает это в одной транзакции то это не важно. Или важно
если ты про меня то я просто всем проставил orpahanRemoval: true и жду чуда, а оно не случается, а в кокой оно последовательности делается откуда ж мне знать, оно ж само там
Михаил
Михаил
я говорю про то что важно ли в каком порядке доктрина удаляет сирот
Михаил
по идее сначала она должна грохнуть сирот а потом родителя
Viktor
а нахрена оно тогда вообще нужно если доктрина не удаляет сирот
Так удаляет же как раз, но она автоматически же это делает при удалении родителя .
Михаил
если делает наоборот но ясен красен будет ошибка
Вадим
пиздец как сложно-то, зачем так сложно.. :(
Вадим
3й день я думаю как блин удалить сущность, обо мне уже плохо думают
Михаил
3й день я думаю как блин удалить сущность, обо мне уже плохо думают
хорошо бы узнать схему твоей бд, кого ты там обозвал сиротами и что за ошибка - без этого это просто гадание на кофейной пуще
Юра
Делаете $em->remove($post);
Не совсем. Если вы делаете комментарию setPost(null), тогда по идее орфан коммент удалиться
Михаил
Не совсем. Если вы делаете комментарию setPost(null), тогда по идее орфан коммент удалиться
а ещё если коллекция сущностей и вместо обновлении коллекции вы удаляете эту коллекцию и пересоздаёте новую то все сущности из коллекции становятся сиротами. И по запросам можно увидеть что 150 сущностей удалилось а 151 сущность создалась
Юра
Вообще это всегда путает и каждый раз нужно думать как это работает
Вадим
а с морозу вообще тяжеловато
Вадим
https://gist.github.com/pylebecq/f844d1f6860241d8b025
спасибо большое, сильно полегчало!
Вадим
вот бы ещё кто-нибудь рассказал что произойдёт если указать и то и другое
Вадим
foreach ($task->getAttachments() as $attachment) { $task->removeAttachment($attachment); } $this->taskRepository->remove($task); $this->entityManager->flush(); у свойства attachments указано cascade: ['persist', 'remove'] SQLSTATE[23502]: Not null violation: 7 ERROR: null value in column \"task_id\" of relation \"attachment\" violates not-null constraint\nDETAIL: Failing row contains (4, null, 30, 1, 2024-07-02 09:57:41).",
Вадим
Похоже у тебя стоит nullable false на рилейшене
верно, стоит. Ну я думал это так круто
Вадим
у меня оно везде так
Юра
Ну покажи код removeAttachment
Вадим
public function removeAttachment(Attachment $attachment): static { if ($this->attachments->removeElement($attachment)) { // set the owning side to null (unless altask:ready changed) if ($attachment->getTask() === $this) { $attachment->setTask(null); } } return $this; }
Юра
Ну вот
Юра
Ты ставишь таск в нул, удаляешь таск
Юра
А что должно остаться у аттачмента
Юра
Если оно nullable false
Вадим
так аттачмент же орфан, а как же магия orphanRemoval: true
Вадим
я ж хочу чобы оно удалилось
Вадим
как ООП и всё такое
Юра
Убери вообще этот орфан. Он редко когда нужен
Юра
Поставь cascade: delete
Вадим
та бля :)
Юра
Если тебе нужно удалять все аттачменты
Вадим
Поставь cascade: delete
cascade: remove то же самое
Юра
Ты удяляешь таску, база удаляет таску и все аттачменты
Юра
Проверь что оно указано в правильном месте
Вадим
Юра
Cascade delete должен в базе у ФК навесить ON DELETE CASCADE никакой магии
Вадим
не хотел так
Вадим
хотел чтобы события ORM остались
Вадим
оно ж там втихую, вжик
Вадим
а мне протоколировать всё надо
Вадим
кто что когда
Юра
Ну значит поставь нулабл тру
Юра
И проверь удаляет или нет
Вадим
пиздец ну что за жизнь в доктрине целых 2 способа удаления и ни один не работает
Вадим
мы строили строили и наконец построили
Кирилл
получилось?
Вадим
а может там есть где-то включалка этой магии?
Вадим
може она у меня выключеная
Nikolay
ты имеешь в виду onDelete: 'CASCADE' ?
Вот самое надёжное, точно работает
Вадим
Вот самое надёжное, точно работает
та это понятно, в этом я не сомневаюсь
Вадим
но надо то
Юра
У тебя ещё есть какая-то энтити TaskPlan видимо
Юра
Которая ссылается без on delete cascade на task
Вадим
private function remove(Task $task): void { foreach ($task->getChildren() as $child) { $this->taskRepository->remove($child); } foreach ($task->getComments() as $comment) { $this->commentRepository->remove($comment); } foreach ($task->getLogEntries() as $logEntry) { $this->logEntryRepository->remove($logEntry); } foreach ($task->getAttachments() as $attachment) { $this->mediaObjectRepository->remove($attachment->getMediaObject()); $this->attachmentRepository->remove($attachment); } foreach ($task->getFieldValues() as $fieldValue) { $this->fieldValueRepository->remove($fieldValue); } $this->taskPlanRepository->remove($task->getTaskPlan()); $this->taskRepository->remove($task); $this->entityManager->flush(); }
Вадим
вот, так работает
Вадим
говно ваше ооп, говно ваша доктрина
Вадим
понахуячили сложноты в которой разбираются 5 человек на планете
Doctor
Как говорится, много букв и не читал, но вот такое не смогло бы спасти ситуацию? ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED
Вадим
нет, хочу события доктрины
а вот DEFERRABLE и INITIALLY DEFERRED может и помогли бы...
Вадим
а, или нет, это ж не про нулабл фалс
Doctor
Как раз при NOT NULL могло бы помочь
Вадим
Как раз при NOT NULL могло бы помочь
ну, как нибудь потом обязательно, кто-нибудь пусть это проверит :))
Михаил
Как раз при NOT NULL могло бы помочь
э, что за отвлечения. Где торговля, док?
Михаил
ну, как нибудь потом обязательно, кто-нибудь пусть это проверит :))
Я бы на твоём месте прислушался к человеку. Он проект https://beta.scouts.su чисто на symfony + doctrine написал и всё там с ооп нормально.