Если вы хотите мягкие данные удаления в Adonis V5, к сожалению, он не встроен в основную архитектуру. Если вы не знакомы с концепцией мягких удалений, это концепция, что при удалении данных из базы данных, вы на самом деле не удаляете ее, а скорее установку флага, чтобы указать, что он находится в удаленном состоянии. Эти строки не должны вернуться в запросы к базе данных, но все же существуют при необходимости в будущем.
Мягкие удаления приводят несколько преимуществ к таблице в зависимости от ваших бизнес-требований.
- Вы можете по закону необходимости сохранить данные в базе данных или в резервной копии, но вам нужно переходное время для вашего резервной реализации.
- Связанные данные зависят от удаленных данных для существующих, даже если он больше не будет использоваться пользователем или другими сервисами.
- Он может создать «мусорное то, что можно просмотреть» для пользователей, создающих восстановление данных быстрее и проще.
- Создает историю отслеживания для внутреннего или аудита клиентов.
Есть много преимуществ, но знают, что вы принимаете решение о сохранении большого количества данных и должны понимать последствия для того, чтобы делать такие в долгосрочной перспективе.
Начиная
Флаг мы будем использовать в этом руководстве, это столбец, добавленный в таблицы, которые мы хотим вызвать deleded_at
Отказ Этот столбец поможет нам знать, какие строки базы данных являются активными VS, удаляются для будущих запросов и обновлений. Чтобы начать, у нас уже должно быть проект Adonis, созданный с нашим выбором базы данных. Мы будем использовать MySQL как наш базовый уровень. Мы также предполагаем, что эти два шага для этого руководства уже завершены. После настройки схемы проекта и базы данных нам нужно будет создать нашу первую миграцию.
node ace make:migration posts
Это создаст миграцию постов, которые мы будем использовать для создания и программных сообщений удаления в нашей базе данных. Для мягких удалений мы будем использовать deleded_at
с типом колонны datetime
Отказ Таким образом, мы можем отслеживать оба POST, как мягкое удаление, и когда он был мягким удален. Мягкие удаления также могут быть достигнуты, альтернативно, используя столбец is_deleted
с типом логический
и отслеживание изменений в целом с Updated_at
столбец.
///database/migrations/012345678987654321_posts.ts import BaseSchema from '@ioc:Adonis/Lucid/Schema' export default class Posts extends BaseSchema { protected tableName = 'posts' public async up () { this.schema.createTable(this.tableName, (table) => { table.increments('id').primary() table.string("name", 254).notNullable(); table.text("description"); table.dateTime("deleted_at").defaultTo(null); table.timestamps(true) }) } public async down () { this.schema.dropTable(this.tableName) } }
С нашей миграцией на месте мы можем теперь перенести нашу базу данных и настроить наши посты стола.
node ace migration:run
Подключение ORM
Нам нужно создать нашу модель для определения наших столбцов поля для ORM Adonis. Это будет иметь решающее значение для реализации мягких удалений на лету и программно в различных функциях и контроллерах. Без модели выполнение мягких удалений потребовало бы не только больше линий дублированного кода, но более вручную трудолюбиться где угодно и везде нам нужно управлять мягкой парадигмой удаления.
Следующая команда будет инициировать нашу почтовую модель:
node ace make:model Post
///app/Models/Post.ts import { DateTime } from 'luxon' import { column, BaseModel } from '@ioc:Adonis/Lucid/Orm' export default class Post extends BaseModel { @column({ isPrimary: true }) public id: string @column() public name: string @column() public body: string @column.dateTime({ serializeAs: null}) public deletedAt: DateTime @column.dateTime({ autoCreate: true }) public createdAt: DateTime @column.dateTime({ autoCreate: true, autoUpdate: true }) public updatedAt: DateTime }
Реализация мягкого удаления
Поскольку мы хотим, чтобы мягкие удаления произошли за любые возможные количества моделей, мы собираемся извлечь внедрение в качестве службы ADONIS. Поскольку Adonis не работает с командой ACE для создания службы, мы вручную создаем папку наших служб внутри папки приложения и создать SoftDelete.ts
Сервисный файл.
///app/Services/SoftDelete.ts import { LucidRow } from '@ioc:Adonis/Lucid/Model' import { DateTime } from 'luxon'; // Optional null check query export const softDeleteQuery = (query: ModelQueryBuilderContract ) => { query.whereNull('deleted_at') } export const softDelete = async (row: LucidRow, column: string = 'deletedAt') => { if(row[column]) { if(row[column].isLuxonDateTime) { // Deleted represented by a datetime row[column] = DateTime.local(); } else { // Deleted represented by a boolean row[column] = true; } await row.save(); } }
SoftDelete
Функция является наиболее важной частью и является двигателем для распределения функциональности мягкой удаления в масштабе к любому количеству моделей. Softdeleteequery
Необязательно, что мы будем добавлять в нашу почтовую модель запросов дальше. Обе функции должны быть обновлены на основе того, как вы реализуете свой мягкую колонку удаления. Обновите обе функции по мере необходимости для проверки на столбце логический
или datetime
Как и обновите имя столбца. Функции проверки. Как напоминание, имя столбца, которое мы используем в примерах в этом руководстве deleded_at
Отказ
Добавление услуг в модели
Мы собираемся добавить услугу, которую мы только что создали в модель Post. Adonis поставляется с крючками, встроенными, которые позволяют нам перехватить или переопределить модель жизненного цикла. В нашем случае мы будем переоценивать функциональность удаления и обновлять Fetch и найти не включать строки, которые были мягкими удалены.
Требуемый импорт:
import { beforeFind, beforeFetch } from '@ioc:Adonis/Lucid/Orm' import { softDelete, softDeleteQuery } from '../Services/SoftDelete'
Ниже приведена суммарная модель Post, показывающая импортные и функциональные реализации, которые мы только что создали.
// Summarized Post.ts import { beforeFind, beforeFetch } from '@ioc:Adonis/Lucid/Orm' import { softDelete, softDeleteQuery } from '../Services/SoftDelete'; export default class Post extends BaseModel { // ... Additional model details here @beforeFind() public static softDeletesFind = softDeleteQuery; @beforeFetch() public static softDeletesFetch = softDeleteQuery; public async softDelete(column?: string) { await softDelete(this, column); } }
В коде выше у вас есть два варианта. Вы можете добавить в дополнительный метод к модели, как мы сделали. Это позволяет нам сохранить родную удаление, а также добавить в мягкую удаление. Опасность вот если вы реализуете Soft Delete, без надлежащей документации и обзора кода, другой разработчик может использовать основной метод удаления, не зная, что мягкое удаление – это переход к способу. Если это то, что вы хотите избежать, то вместо добавления нового метода вы можете переопределить метод удаления путем переназначения.
public async delete = softDelete;
Удалить все вещи
Давайте пойдем вперед и проверим этот новый метод Soft Delete. Мы будем пропущены по созданию маршрута и контроллера и демонстрационные функции контроллера, которые будут звонить Get и Delete.
Этот первый пример показывает простое удаление, реализующее нашу мягкую удаление метода.
public async delete ({ request, response, auth }: HttpContextContract) { try { const postId = request.input('id') const post = await Post.findOrFail(postId) await post.softDelete() return response.json({}) } catch (error) { return response.json(error) } }
Следующий пример демонстрирует реализацию раньше
и Forefind
Крючки. В результате наши запросы вернут все строки, которые не были мягкими удалены.
public async getAll({ response }: HttpContextContract) { try { const posts = await Post.all() return response.json(posts) } catch (error) { return response.json(error) } }
Там у вас есть! Мы не создаваем мягкую удаление парадигмы, которая может быть легко масштабирована в любой модели в нашей системе.
Последние мысли
Реализация Soft Delete – это функция питания, которая позволяет сохранить и контролировать все данные в вашей базе данных. Он имеет как преимущества постоянства данных, так и долгосрочного управления, но также поставляется с предупреждением о техническом обслуживании данных и экспоненциальным ростом в долгосрочной перспективе. Пока вы знаете все варианты и последствия, реализация мягких удалений может стать уникальным и мощным инструментом, так как ваше приложение или продукт расширяется.
Если вы нашли это полезным или полезным, пожалуйста, поделитесь A 💓, 🦄 или 🔖. Спасибо!
Оригинал: “https://dev.to/mmcshinsky/implementing-soft-delete-in-adonisjs-v5-1kpd”