1

Тема: Як ви реалізовуєте видалення звязних моделей?

Всім доброго вечора. Стараюсь зробити універсальний спосіб видалення звязних моделей на сайтах. Тобто універсальну модель яка буде включати логіку видалення обєктів (Обєкти можуть бути звязані наступними типами: один-до-одного, один-до-багатьох, багато-до-багатьох)

Для прикладу у вас є модель Користувач, у нього є список телефонів (моделі з іншої таблиці),
Я видаляю Користувача і автоматично видаляються телефони.

Існують випадки що звязані дані не потрібно видаляти, для прикладу Статті користувача видаляти не хочеться, як тоді бути? Виставляти дефолтного юзера для статті чи щось таке? Чи забороняти видалення користувача якщо у нього є звязанні Статті.

2

Re: Як ви реалізовуєте видалення звязних моделей?

Скажу чесно, прописую все вручну sql-запитами. Так на душі спокійніше. У кожного видалення свої особливості.
У випадку зі статтями: виконувати Left Join при селекті, тоді просто все, що стосується користувача, якщо його не існує, заповниться NULL.

Про універсальність, можливо якось в моделі вказувати, що це тісне поєднання, а це слабке поєднання. При тісному видаляти із пов'язаної таблиці, а при слабкому ні.

3

Re: Як ви реалізовуєте видалення звязних моделей?

Я хочу реалізувати ось так

// масив статтей (один-до-багатьох)
$articles = $user->articles();

// масив телефонів (один-до-багатьох)
$phones = $user->phones(); 

//видаляє телефони і все що звязане з юзером
$user->delete(); 

Писати вручну не хочеться. Розкажу чому:)
1. Є обєкт Диллер у нього приблизно 10 звязаних таблиць, телефони, місцез находження, компанії одним словом не мало звязків.
2. Згідний що простий sql запит надійніший але якщо динамічний проект то додавати кожен раз подвійний функціонал не хочеться. А так здавав один раз звязок і готово)

4

Re: Як ви реалізовуєте видалення звязних моделей?

Можна це реалізувати через шаблон Observer. Observer слідкує за User, як тільки другий видаляється, перший має подбати про видалення пов'язаних сутностей. Це як варіант, може бути купа різних реалізацій вашого завдання.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

5

Re: Як ви реалізовуєте видалення звязних моделей?

Саме складне то це логіка.
Якщо видаляємо користувача видаляємо Статтю,
Якщо видаляємо статтю, видаляємо коментар.

І хто зна до якого рівня може це дойти))

Ще одна неприємна штука це відсутність транзакцій у файловій системі))
Якщо під час видалення щось навернулось то з базою проблем не буде, а файли уже не відновиш)

6

Re: Як ви реалізовуєте видалення звязних моделей?

Реалізуйте транзакції самі. Перед видаленням зчитуйте файли в буфер, якщо транзакція пройшла успішно - очищуємо буфер, якщо ні - відновлюємо файли з буфера.)
п.с Я працював з багатьма cms, і лише в одній із них були реалізовані транзакції.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }
Подякували: funivan1

7

Re: Як ви реалізовуєте видалення звязних моделей?

http://www.narthex-daemon.net/postimages/software-design14.png
Погляньте на попередній малюнок. Subject - це інтерфейс типу observerable, Observer - абстрактинй обсервер. ConcreteSubject - це ваш User, а ConcreteObserver це його обсервер. Коли ConcreteSubject буде видалятися, він може викликати SetState("after_delete"), потім Notify(). Таким чином ConcreteObserver буде повідомлений про те що у ConcreteSubject сталися зміни і його статус змінився на "after_delete". Далі ConcreteObserver має подбати про видалення телефонів і всього що ще необхідно видалити. Ви також можете передати об'єкт ConcreteSubject у якості параметра (eventObject) обсерверу для того щоб останній знав з яким саме ConcreteSubject він працює.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }
Подякували: Replace1

8

Re: Як ви реалізовуєте видалення звязних моделей?

Якщо користувач видаляється обєкт знищується, як тоді дати зрозуміти класу ConcreteObserver від якого користувача видаляти телефони. Тобто записувати ід користувача кудись і передавати його ?

9

Re: Як ви реалізовуєте видалення звязних моделей?

Реалізуйте транзакції самі. Перед видаленням зчитуйте файли в буфер, якщо транзакція пройшла успішно - очищуємо буфер, якщо ні - відновлюємо файли з буфера.)
п.с Я працював з багатьма cms, і лише в одній із них були реалізовані транзакції.

Ну записувати файли у буфер це напряг, а от шлях до них цілком реально)

В якій cms були транзакції. І ви маєте на увазі транзакції з базою чи транзакції файлової системи?

10

Re: Як ви реалізовуєте видалення звязних моделей?

funivan написав:

Якщо користувач видаляється обєкт знищується, як тоді дати зрозуміти класу ConcreteObserver від якого користувача видаляти телефони. Тобто записувати ід користувача кудись і передавати його ?

Передавати якийсь параметр (eventObject) який буде містити інформацію потрібну для обсервера. Це може бути айдішка або ще щось.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

11

Re: Як ви реалізовуєте видалення звязних моделей?

funivan написав:

Реалізуйте транзакції самі. Перед видаленням зчитуйте файли в буфер, якщо транзакція пройшла успішно - очищуємо буфер, якщо ні - відновлюємо файли з буфера.)
п.с Я працював з багатьма cms, і лише в одній із них були реалізовані транзакції.

Ну записувати файли у буфер це напряг, а от шлях до них цілком реально)

В якій cms були транзакції. І ви маєте на увазі транзакції з базою чи транзакції файлової системи?

Транзакції з базою, система Magento.

Щоб зрозуміти рекурсію потрібно спочатку зрозуміти рекурсію.
int fac(int n) { return n < 2 ? 1 : n*fac(n-1); }

12

Re: Як ви реалізовуєте видалення звязних моделей?

Транзакції з базою, система Magento.

Теж пишу cms чи міні фреймворк намагаюсь теж транзакції підтримувати зразу) Корисна штука)