Skip to content

image


Sutando ORM:为 Node.js 带来 Laravel Eloquent 的开发体验
Dylan YuDylan Yu
大约 1 年前

你熟悉的 Active Record,现在来到了 JavaScript

Sutando ORM 与 Laravel Eloquent 一脉相承——相同的方法、命名和约定——同时可以在 Node.js 生态中的任何地方运行,无需绑定全栈框架。

几乎可以无缝替换 Laravel Eloquent

如果你写过 Eloquent 查询,你就已经会使用 Sutando 了:

ts
// models/User.ts
import { Model, Attribute } from 'sutando';

export class User extends Model {
  table = 'users';

  // cast
  casts = {
    metadata: 'json',
  }

  // 

  // attribute
  attributeFullName() {
    return Attribute.make({
      get: () => {
        return this.first_name + ' ' + this.last_name;
      },
    });
  }

  // relation
  relationPosts() {
    return this.hasMany(Post);
  }
}

const users = await User.query().with('posts').get();
  • 相同的关联方法(hasManybelongsTomorphTo 等)
  • 可链式调用的查询构造器,支持 whereorderBylimitwithhaswhereHas
  • 软删除、事件、全局作用域和预加载的工作方式与 Laravel 完全一致
  • 迁移、工厂和种子遵循相同的理念——从 PHP 迁移轻而易举

框架无关设计——与 AdonisJS 对比

AdonisJS 这类全栈方案自带 Lucid ORM,在你全面采用该框架时表现出色。Sutando 则走了一条不同的路

特性Sutando ORMAdonisJS Lucid
框架依赖无——可接入 Express、Fastify、Next.js、Cloudflare Workers、Bun 或任何其他环境与 AdonisJS 紧密集成
迁移到现有项目即插即用;无需重写你的服务器需要采用 AdonisJS 的约定

这种解耦设计让你可以逐步引入 Sutando——加到现有的 Express API、React 服务端中,甚至如果你更喜欢它的 API,也可以集成到 AdonisJS 项目里。

流畅的查询构造器示例

ts
const latestActive = await User.query()
  .with('posts.comments')
  .where('status', 'active')
  .orderBy('created_at', 'desc')
  .limit(10)
  .get();

就像在 Laravel 中一样,这段代码读起来就像一句话——没有多余的样板代码,不需要重新适应新的思维模式。

强大的插件与生命周期钩子

需要软删除、多租户或自动时间戳?写一次,到处适用:

ts
User.saving(async (model) => {
  model.last_updated_at = new Date();
});

快速开始

bash
npm install sutando --save

配置你的数据库,创建你的第一个模型,然后运行查询——无需框架迁移。完整文档请访问 **https://sutando.org/zh_CN/guide/getting-started.html**。

ts
import { sutando, Model } from 'sutando';

// 添加数据库连接信息
sutando.addConnection({
  client: 'mysql2',
  connection: {
    host : '127.0.0.1',
    port : 3306,
    user : 'root',
    password : '',
    database : 'test'
  },
});

const db = sutando.connection();

// 使用查询构造器
const users = await sutando.table('users').where('votes', '>', 100).get();
// 或
const users = await db.table('users').where('votes', '>', 100).get();

// 使用 Schema 构造器
await sutando.schema().createTable('users', table => {
  table.increments('id').primary();
  table.integer('votes');
  table.timestamps();
});

// 使用 ORM
class User extends Model {}
const users = await User.query().where('votes', '>', 100).get();

更快地开发,保持灵活性

Sutando ORM 带来了 Laravel 爱好者钟爱的 Eloquent 开发体验,同时保持架构的开放性。无论你是在升级 JavaScript 代码库、尝试 Serverless 架构,还是只是想要一个用起来顺手的 Active Record,Sutando 都已准备好为你的下一个应用赋能——无需框架。

Released under the MIT License.