@ codenameryuu/ adonis- lucid- soft- 删除
这个加通将功能添加到软删除 Lucid Models 通过 deleted_at 在阿多尼斯JS的旗帜.
所需经费
- 阿多尼斯Js 7号
- 22岁或以上
安装
- 安装软件包
yarn add @codenameryuu/adonis-lucid-soft-deletes
- 配置软件包
node ace configure @codenameryuu/adonis-lucid-soft-deletes
- 确保在内部注册提供者
adonisrc.ts文档.
providers: [
// ...
() => import('@codenameryuu/adonis-lucid-soft-deletes/provider'),
],
你应该加上 deleted_at 框中包含软删除的模型.
// migrations/1234566666_users.ts
import { BaseSchema } from '@adonisjs/lucid/schema'
export default class extends BaseSchema {
protected tableName = 'products'
async up() {
this.schema.createTable(this.tableName, (table) => {
// ...
table.timestamp('deleted_at').nullable()
})
}
// ...
}
将软删除应用到模型
import { compose } from '@adonisjs/core/helpers'
import { SoftDeletes } from '@codenameryuu/adonis-lucid-soft-deletes'
import { ProductSchema } from "#database/schema";
export default class Product extends compose(ProductSchema, SoftDeletes) {
// ...columns and props
}
现在,当你叫 .delete() 模型上的方法 deleted_at (单位:千美元) customDeletedAtColumn 栏
将设定为当前日期和时间。 然而,模型的数据库记录会留在表中.
import type { HttpContext } from '@adonisjs/core/http'
import Product from '#models/product'
export default class ProductsController {
/**
* Delete product by id
* DELETE /products/:id
*/
async destroy({ request, response }: HttpContext) {
const product = await Product.findOrFail(request.input('id'))
await product.delete()
return product // or response.noContent()
}
}
:boom:软删除只用于模型实例.
await Product.query().delete()和以前一样 将删除数据库中的模型
:point right:在查询使用软删除的模型时,软删除的模型 将自动排除在所有查询结果之外.
要确定给定的模型实例是否被软删除, 您可以使用 .trashed 获取器 :
import type { HttpContext } from '@adonisjs/core/http'
import Product from '#models/product'
export default class ProductsController {
/**
* Get product by id
* GET /products/:id
*/
async show({ request, response }: HttpContext) {
const product = await Product.withTrashed().where('id', request.input('id')).firstOrFail()
if (product.trashed) {
return response.forbidden()
}
return product
}
}
恢复软删除模式
要恢复软被删除的模型,你可以调用 .restore() 模式实例上的方法.
此外,方法 .restore() 方法后存在 .withTrashed() 财务报告和审定财务报表 .onlyTrashed()
这个 restore 方法将设置模型的 deleted_at 列为 null 数字 :
import type { HttpContext } from '@adonisjs/core/http'
import Product from '#models/product'
export default class TrashProductsController {
/**
* Update trashed product by id
* PUT /trash/products/:id
*/
async update({ request }: HttpContext) {
const product = await Product.withTrashed().where('id', request.input('id')).firstOrFail()
await product.restore()
return product
// or
await Product.withTrashed().where('id', request.input('id')).restore()
await Product.query().withTrashed().where('id', request.input('id')).restore()
}
}
永久删除模式
有时你可能需要从数据库中真正删除一个模型.
你可以用这个 .forceDelete() 从数据库表格中永久删除软删除模型的方法 :
import type { HttpContext } from '@adonisjs/core/http'
import Product from '#models/product'
export default class ProductsController {
/**
* Delete product by id
* DELETE /products/:id
*/
async destroy({ request, response }: HttpContext) {
const product = await Product.findOrFail(request.input('id'))
await product.forceDelete()
return response.noContent()
}
}
包括软删除模型
如上所述,软被删除的模型将自动被排除在查询结果之外.
然而,您可能会强制软被删除的模型包含在查询结果中
通过呼叫 .withTrashed() 模型上的方法 :
import type { HttpContext } from '@adonisjs/core/http'
import Product from '#models/product'
export default class ProductsController {
/**
* Get a list products
* GET /products?withTrashed=1
*/
async index({ request }: HttpContext) {
return Product.query()
.if(request.input('withTrashed'), (query) => {
query.withTrashed()
})
.paginate(request.input('page', 1), request.input('perPage', 10))
}
}
只获取软被删除的模型
这个 .onlyTrashed() 方法将检索 仅限 软被删除的模型 :
import type { HttpContext } from '@adonisjs/core/http'
import Product from '#models/product'
export default class TrashProductsController {
/**
* Get a list trashed products
* GET /trash/products
*/
async index({ request }: HttpContext) {
return Product.onlyTrashed().paginate(request.input('page', 1), request.input('perPage', 10))
}
}
软删除方法
方法 .withTrashed() , (中文(简体) ), .onlyTrashed() 财务报告和审定财务报表 .restore() 也可用
在ModelQueryBuilder中,用于软删除的模型,例如:
await Product.query().withTrashed().paginate(request.input('page', 1), request.input('perPage', 10))
await Product.query().onlyTrashed().paginate(request.input('page', 1), request.input('perPage', 10))
许可证
此软件包是开源软件,根据 麻省理工学院许可证。 。 。 .