📜  adonis 多对多 - TypeScript (1)

📅  最后修改于: 2023-12-03 15:13:16.717000             🧑  作者: Mango

Adonis 多对多 - TypeScript

AdonisJS 是一个基于 Node.js 的 MVC 框架,它可以帮助你快速构建 Web 应用程序。AdonisJS 非常适合构建大型 Web 应用程序,它包含许多工具和库,用于处理一些常见任务,例如路由、会话、数据库、缓存等等。在 AdonisJS 中,可以通过多对多关系将多个模型关联起来。

在 TypeScript 中使用 AdonisJS,可以让我们在开发过程中更容易地遵循良好的类型维护和结构,从而增加代码质量和可维护性。在本文中,我们将介绍如何在 AdonisJS 中使用 TypeScript 处理多对多关系。

在 AdonisJS 中定义多对多的关系

在 AdonisJS 中,可以通过 Lucid ORM 来定义多对多的关系。Lucid ORM 是 AdonisJS 自带的 ORM,它提供了许多功能,例如关联、查询构建器、数据验证等等。

首先,我们需要定义两个模型,并在它们之间创建多对多关系。例如,我们定义了 Book 和 Author 两个模型,并且它们之间有多对多的关系。我们可以在 Book 模型中定义 followingAuthors() 方法,并通过 belongsToMany() 方法将它们与 Author 模型连接起来。

// app/Models/Book.ts

import { BaseModel, belongsToMany, BelongsToMany } from "@ioc:Adonis/Lucid/Orm"
import Author from "./Author"

export default class Book extends BaseModel {
  @belongsToMany(() => Author)
  public followingAuthors: BelongsToMany<typeof Author>
}

然后我们需要在 Author 模型中定义 followingBooks() 方法,并通过 belongsToMany() 方法将它们与 Book 模型连接起来。

// app/Models/Author.ts

import { BaseModel, belongsToMany, BelongsToMany } from "@ioc:Adonis/Lucid/Orm"
import Book from "./Book"

export default class Author extends BaseModel {
  @belongsToMany(() => Book)
  public followingBooks: BelongsToMany<typeof Book>
}
在 TypeScript 中构建多对多关系的查询

在 AdonisJS 中,我们可以使用 Lucid ORM 来处理多对多关系,而在 TypeScript 中,我们可以通过类型推导来获得良好的类型维护和结构。

例如,我们想查询具有指定作者的所有书籍。我们可以通过定义一个 async 函数来查询这些书籍,它接受一个 author 实例并返回所有书籍的列表。在此之前,需要注意我们需要先在模型中增加关系。

// app/Services/BookService.ts

import Author from "App/Models/Author"
import Book from "App/Models/Book"

export default class BookService {
  public async findByAuthor(author: Author) {
    const books = await author
      .related("followingBooks")
      .query()
      .select("*")
      .orderBy("id", "asc")
    return books
  }
}

使用 related() 方法可以建立多对多的关系,在 query 中可以构造各种查询条件,比如我们这里查询了所有的书籍,也可以增加 where 语句,使查询更加精确。由于我们在模型中使用了 Lucid ORM 的 BelongsToMany 类型,我们可以轻松地将它们传递给其他函数或组件,而不必担心传递错误的类型。

// app/Controllers/Http/BookController.ts

import { HttpContextContract } from "@ioc:Adonis/Core/HttpContext"
import BookService from "App/Services/BookService"
import Author from "App/Models/Author"

export default class BookController {
  public async index({ request, response }: HttpContextContract) {
    const authorId = request.input("authorId")
    const author = await Author.query().where("id", authorId).firstOrFail()

    const books = await new BookService().findByAuthor(author)

    response.ok(books)
  }
}

在控制器中使用我们编写的查询方法。

如何使用多对多关系来实现更多功能

在 AdonisJS 中,多对多关系可以帮助我们处理许多任务,例如从多个模型之间检索、过滤等等。使用 TypeScript 可以让我们在开发过程中更轻松地遵循良好的类型约束和代码结构。在撰写本文的过程中只涉及到了基本的查询功能,而实际上,AdonisJS 的 ORM 提供了各种高级查询和过滤方法,可以满足复杂的应用场景。

总结

AdonisJS 是一个非常强大的 Node.js MVC 框架,它可以帮助我们快速构建 Web 应用程序。通过使用 TypeScript,我们可以轻松地将良好的类型约束和代码结构引入到我们的应用程序中。使用多对多关系,我们可以轻松地处理多个模型之间的关系,并提高应用程序的可维护性。