×

Cài đặt thư viện Objection.js trong JavaScript

Giới Thiệu Về Objection.js

Objection.js là một ORM (Object Relational Mapping) cho Node.js và sử dụng SQL-based databases như PostgreSQL, MySQL và SQLite. Tạo ra bởi Szwacz, Objection.js là một công cụ mạnh mẽ giúp dễ dàng tương tác với cơ sở dữ liệu thông qua một lớp ứng dụng. Đây là thư viện ORM được nhiều nhà phát triển ưa chuộng vì tính linh hoạt, khả năng mở rộng và dễ sử dụng.

Lợi Ích Của Việc Sử Dụng Objection.js

Việc sử dụng Objection.js đem lại nhiều lợi ích như:

  1. Điều Hướng Liên Kết: Quản lý liên kết giữa các bảng, thậm chí là các liên kết phức tạp.
  2. Khoảng Không Gian API Dễ Dùng: Truy vấn cơ sở dữ liệu trở nên đơn giản và rõ ràng.
  3. Khả Năng Tùy Biến Cao: Có thể dễ dàng mở rộng và tùy chỉnh các mô hình dữ liệu.
  4. Tích Hợp Tốt Với Knex.js: Knex.js là một SQL query builder mạnh mẽ, tạo nên sự kết hợp hoàn hảo với Objection.js.

Cài Đặt Objection.js

Cài đặt Objection.js tương đối đơn giản nếu bạn đã quen thuộc với Node.js. Để bắt đầu, bạn cần đảm bảo rằng Node.js và npm đã được cài đặt trên hệ thống của bạn.

Bước 1: Khởi Tạo Dự Án Node.js

Trước tiên, bạn cần tạo một dự án Node.js mới hoặc sử dụng một dự án hiện có.

mkdir my-objection-project
cd my-objection-project
npm init -y

Bước 2: Cài Đặt Objection.js và Knex.js

Tiếp theo, bạn cần cài đặt Objection.js và Knex.js. Bạn cũng sẽ cần cài một driver cơ sở dữ liệu tương ứng, ví dụ PostgreSQL, MySQL hoặc SQLite.

npm install knex objection
npm install pg # Nếu bạn sử dụng PostgreSQL
# Hoặc npm install mysql2 nếu sử dụng MySQL
# Hoặc npm install sqlite3 nếu sử dụng SQLite

Bước 3: Cấu Hình Knex.js

Tạo tập tin knexfile.js để cấu hình Knex.js.

module.exports = {
  development: {
    client: 'pg', // Hoặc 'mysql', 'sqlite3' dựa trên sự lựa chọn của bạn
    connection: {
      host: '127.0.0.1',
      user: 'your_database_user',
      password: 'your_database_password',
      database: 'myapp_test'
    }
  }
};

Bước 4: Khởi Tạo Kết Nối Cơ Sở Dữ Liệu

Trong tập tin index.js, chúng ta sẽ khởi tạo kết nối cơ sở dữ liệu với Knex.js và thiết lập Objection.js.

const { Model } = require('objection');
const Knex = require('knex');
const knexConfig = require('./knexfile');

// Khởi tạo knex instance
const knex = Knex(knexConfig.development);

// Kết nối Objection.js với knex instance
Model.knex(knex);

Tạo Các Mô Hình Bằng Objection.js

Bước 1: Tạo Mô Hình Cơ Bản

Chúng ta sẽ tạo một thư mục tên là models và thêm một tệp User.js.

// models/User.js
const { Model } = require('objection');

class User extends Model {
  static get tableName() {
    return 'users';
  }

  static get idColumn() {
    return 'id';
  }

  static get jsonSchema() {
    return {
      type: 'object',
      required: ['name', 'email'],
      properties: {
        id: { type: 'integer' },
        name: { type: 'string', minLength: 1, maxLength: 255 },
        email: { type: 'string', minLength: 1, maxLength: 255 }
      }
    };
  }
}

module.exports = User;

Bước 2: Di Chuyển (Migrations)

Chúng ta cần thực hiện các "migrations" để tạo bảng trong cơ sở dữ liệu. Tạo một migrations thư mục và tạo một tệp mới:

mkdir migrations
touch migrations/20210915000000_create_users_table.js
exports.up = function(knex) {
  return knex.schema.createTable('users', (table) => {
    table.increments('id').primary();
    table.string('name').notNullable();
    table.string('email').notNullable().unique();
  });
};

exports.down = function(knex) {
  return knex.schema.dropTableIfExists('users');
};

Chạy lệnh Knex để thực hiện migration:

npx knex migrate:latest

Bước 3: Sử Dụng Mô Hình

Chúng ta có thể bắt đầu sử dụng mô hình đã tạo để tương tác với cơ sở dữ liệu. Trong index.js, chúng ta sẽ thêm một số truy vấn cơ bản.

const User = require('./models/User');

// Tạo người dùng mới
async function createUser() {
  const newUser = await User.query().insert({
    name: 'Jane Doe',
    email: 'jane@example.com'
  });
  console.log('New User:', newUser);
}

// Lấy danh sách người dùng
async function fetchUsers() {
  const users = await User.query();
  console.log('All Users:', users);
}

// Chạy thử các hàm
createUser().then(() => fetchUsers());

Cách Xử Lý Liên Kết Giữa Các Bảng

Objection.js hỗ trợ nhiều loại liên kết giữa các bảng khác nhau, bao gồm:

  • Quan hệ một - một
  • Quan hệ một - nhiều
  • Quan hệ nhiều - nhiều

Ví dụ về Mối Quan Hệ Một - Nhiều

Giả sử chúng ta có một bảng posts và một bảng users, mỗi người dùng có thể có nhiều bài viết.

Tạo tệp models/Post.js:

// models/Post.js
const { Model } = require('objection');

class Post extends Model {
  static get tableName() {
    return 'posts';
  }

  static get jsonSchema() {
    return {
      type: 'object',
      required: ['title', 'content', 'userId'],
      properties: {
        id: { type: 'integer' },
        title: { type: 'string', minLength: 1, maxLength: 255 },
        content: { type: 'string' },
        userId: { type: 'integer' }
      }
    };
  }

  static get relationMappings() {
    const User = require('./User');
    
    return {
      user: {
        relation: Model.BelongsToOneRelation,
        modelClass: User,
        join: {
          from: 'posts.userId',
          to: 'users.id'
        }
      }
    };
  }
}

module.exports = Post;

Kết Hợp Để Lấy Dữ Liệu Từ Cả Hai Bảng

const User = require('./models/User');
const Post = require('./models/Post');

async function createPost() {
  const newPost = await Post.query().insert({
    title: 'First Post',
    content: 'This is the content of the first post',
    userId: 1 // Giả sử User với ID 1 đã tồn tại
  });
  console.log('New Post:', newPost);
}

async function fetchUserWithPosts() {
  const userWithPosts = await User.query().findById(1).withGraphFetched('posts');
  console.log('User with posts:', userWithPosts);
}

createPost().then(() => fetchUserWithPosts());

Kết Luận

Objection.js là một thư viện ORM mạnh mẽ nhưng dễ sử dụng cho Node.js, giúp việc giao tiếp với các cơ sở dữ liệu SQL dễ dàng hơn rất nhiều. Thông qua hướng dẫn này, bạn đã học cách cài đặt, thiết lập và sử dụng Objection.js để tạo, quản lý và truy vấn dữ liệu trong cơ sở dữ liệu. Việc nắm bắt các khái niệm cơ bản và các tính năng nâng cao của Objection.js sẽ giúp bạn phát triển ứng dụng Node.js mạnh mẽ và hiệu quả hơn.

Comments