softDelete Method - Data Model Repository Reference
The softDelete method of a data model repository soft-deletes one or more records of the data model.
This means that the records are still available in the database, but they are marked as deleted by setting their deleted_at property to the deletion date.
You can later restore the records using the restore method.
softDelete method requires the data model to have a deleted_at property. Data models defined with model.define have this property by default, so you don't need to add it manually.softDelete Parameters#
Soft-Delete Record by ID#
@medusajs/framework package. If you're using an older version of Medusa, change the import statement to @mikro-orm/knex.import {
InjectTransactionManager,
MedusaContext,
MedusaService,
InjectManager,
} from "@medusajs/framework/utils"
import { Context, InferTypeOf, DAL } from "@medusajs/framework/types"
import { EntityManager } from "@medusajs/framework/mikro-orm/knex"
import Post from "./models/post"
class BlogModuleService extends MedusaService({
Post,
}){
// ...
@InjectTransactionManager()
protected async doSomething_(
id: string,
@MedusaContext() sharedContext?: Context<EntityManager>
): Promise<any> {
const [
deletedPosts,
deletedEntities,
] = await this.postRepository_.softDelete(id)
return deletedPosts
}
@InjectManager()
async doSomething(
id: string,
@MedusaContext() sharedContext?: Context<EntityManager>
): Promise<any> {
return await this.doSomething_(id, sharedContext)
}
}
Parameters#
The softDelete method can accept the ID of a record to soft-delete as a string.
Returns#
The method returns a tuple with two elements:
- The first element is an array of the soft-deleted records.
- The second element is an object whose keys are the names of deleted data models, and values an array of deleted record objects.
- This is useful if records from other data models are soft-deleted due to cascading soft-deletes.
For example:
[
[
{
"id": "01JSHAW6Z7KW4X6E8MFPGNEKHC",
"title": "My first post",
"content": "This is my first post",
"metadata": null,
"product_id": null,
"product_ids": [
"prod_01JP4M5T5K55P2JN1F17EY7B2T"
],
"author_id": "01JSHAW6YZNKR65TJ242GCMD2S",
"author": "01JSHAW6YZNKR65TJ242GCMD2S",
"created_at": "2025-04-23T12:44:59.751Z",
"updated_at": "2025-04-23T12:44:59.751Z",
"deleted_at": "2025-04-23T12:45:08.750Z"
}
],
{
"Post": [
{
"id": "01JSHAW6Z7KW4X6E8MFPGNEKHC",
"title": "My first post",
"content": "This is my first post",
"metadata": null,
"product_id": null,
"product_ids": [
"prod_01JP4M5T5K55P2JN1F17EY7B2T"
],
"author_id": "01JSHAW6YZNKR65TJ242GCMD2S",
"author": "01JSHAW6YZNKR65TJ242GCMD2S",
"created_at": "2025-04-23T12:44:59.751Z",
"updated_at": "2025-04-23T12:44:59.751Z",
"deleted_at": "2025-04-23T12:45:08.750Z"
}
]
}
]
Soft-Delete Multiple Records By IDs#
import {
InjectTransactionManager,
MedusaContext,
MedusaService,
InjectManager,
} from "@medusajs/framework/utils"
import { Context, InferTypeOf, DAL } from "@medusajs/framework/types"
import { EntityManager } from "@medusajs/framework/mikro-orm/knex"
import Post from "./models/post"
class BlogModuleService extends MedusaService({
Post,
}){
// ...
@InjectTransactionManager()
protected async doSomething_(
ids: string[],
@MedusaContext() sharedContext?: Context<EntityManager>
): Promise<any> {
const [
deletedPosts,
deletedEntities,
] = await this.postRepository_.softDelete(ids)
return deletedPosts
}
@InjectManager()
async doSomething(
ids: string[],
@MedusaContext() sharedContext?: Context<EntityManager>
): Promise<any> {
return await this.doSomething_(ids, sharedContext)
}
}
Parameters#
The softDelete method can accept an array of record IDs to soft-delete.
Returns#
The method returns a tuple with two elements:
- The first element is an array of the soft-deleted records.
- The second element is an object whose keys are the names of deleted data models, and values an array of deleted record objects.
- This is useful if records from other data models are soft-deleted due to cascading soft-deletes.
For example:
[
[
{
"id": "01JSHAW6Z7KW4X6E8MFPGNEKHC",
"title": "My first post",
"content": "This is my first post",
"metadata": null,
"product_id": null,
"product_ids": [
"prod_01JP4M5T5K55P2JN1F17EY7B2T"
],
"author_id": "01JSHAW6YZNKR65TJ242GCMD2S",
"author": "01JSHAW6YZNKR65TJ242GCMD2S",
"created_at": "2025-04-23T12:44:59.751Z",
"updated_at": "2025-04-23T12:44:59.751Z",
"deleted_at": "2025-04-23T12:45:08.750Z"
}
],
{
"Post": [
{
"id": "01JSHAW6Z7KW4X6E8MFPGNEKHC",
"title": "My first post",
"content": "This is my first post",
"metadata": null,
"product_id": null,
"product_ids": [
"prod_01JP4M5T5K55P2JN1F17EY7B2T"
],
"author_id": "01JSHAW6YZNKR65TJ242GCMD2S",
"author": "01JSHAW6YZNKR65TJ242GCMD2S",
"created_at": "2025-04-23T12:44:59.751Z",
"updated_at": "2025-04-23T12:44:59.751Z",
"deleted_at": "2025-04-23T12:45:08.750Z"
}
]
}
]
Soft-Delete Records by Filters#
import {
InjectTransactionManager,
MedusaContext,
MedusaService,
InjectManager,
} from "@medusajs/framework/utils"
import { Context, InferTypeOf, DAL } from "@medusajs/framework/types"
import { EntityManager } from "@medusajs/framework/mikro-orm/knex"
import Post from "./models/post"
class BlogModuleService extends MedusaService({
Post,
}){
// ...
@InjectTransactionManager()
protected async doSomething_(
id: string,
@MedusaContext() sharedContext?: Context<EntityManager>
): Promise<any> {
const [
deletedPosts,
deletedEntities,
] = await this.postRepository_.softDelete({
title: "My Post",
})
return deletedPosts
}
@InjectManager()
async doSomething(
ids: string[],
@MedusaContext() sharedContext?: Context<EntityManager>
): Promise<any> {
return await this.doSomething_(ids, sharedContext)
}
}
Parameters#
The softDelete method can accept an object of filters to select the records to soft-delete.
In the example above, you pass an object with the title property to soft-delete all records with that title.
Returns#
The method returns a tuple with two elements:
- The first element is an array of the soft-deleted records.
- The second element is an object whose keys are the names of deleted data models, and values an array of deleted record objects.
- This is useful if records from other data models are soft-deleted due to cascading soft-deletes.
For example:
[
[
{
"id": "01JSHAW6Z7KW4X6E8MFPGNEKHC",
"title": "My first post",
"content": "This is my first post",
"metadata": null,
"product_id": null,
"product_ids": [
"prod_01JP4M5T5K55P2JN1F17EY7B2T"
],
"author_id": "01JSHAW6YZNKR65TJ242GCMD2S",
"author": "01JSHAW6YZNKR65TJ242GCMD2S",
"created_at": "2025-04-23T12:44:59.751Z",
"updated_at": "2025-04-23T12:44:59.751Z",
"deleted_at": "2025-04-23T12:45:08.750Z"
}
],
{
"Post": [
{
"id": "01JSHAW6Z7KW4X6E8MFPGNEKHC",
"title": "My first post",
"content": "This is my first post",
"metadata": null,
"product_id": null,
"product_ids": [
"prod_01JP4M5T5K55P2JN1F17EY7B2T"
],
"author_id": "01JSHAW6YZNKR65TJ242GCMD2S",
"author": "01JSHAW6YZNKR65TJ242GCMD2S",
"created_at": "2025-04-23T12:44:59.751Z",
"updated_at": "2025-04-23T12:44:59.751Z",
"deleted_at": "2025-04-23T12:45:08.750Z"
}
]
}
]