Bỏ qua, đến nội dung

Cài đặt và sử dụng

Kích hoạt plugin

Vào Settings → Plugin Manager, bật @digiforce-nc/plugin-field-m2m-array. Plugin đăng ký relation type belongsToArray vào hệ thống.

Khi nào dùng M2M Array thay vì M2M truyền thống?

Tiêu chíDùng M2M ArrayDùng M2M truyền thống
Số lượng targetNhỏ-trung bình (< 100 per record)Lớn hoặc không giới hạn
Metadata trên quan hệKhông cầnCần (ví dụ: role, sort order)
DatabasePostgreSQL (tốt nhất)Mọi DB
Độ phức tạp queryĐơn giảnPhức tạp nhưng linh hoạt

Thêm field belongsToArray

  1. Mở Collection Manager → chọn collection nguồn (source).
  2. Thêm field mới → chọn interface M2M (Array).
  3. Cấu hình:
Thuộc tínhMô tảVí dụ
targetCollection đíchtags
foreignKeyTên cột array trên sourcetagIds
targetKeyPrimary key trên targetid
  1. Lưu — hệ thống tạo cột ARRAY/JSON trên source table.
typescript
const tagsField = {
  name: 'tags',
  type: 'belongsToArray',
  interface: 'mbm',
  target: 'tags',
  foreignKey: 'tagIds',
  targetKey: 'id',
};

Cấu hình target collection

Target collection cần tồn tại trước khi tạo field. Ví dụ:

  • Source: posts → field tags (belongsToArray)
  • Target: tags (cần có collection tags với primary key id)

Khi tạo bản ghi post, người dùng chọn nhiều tag → hệ thống lưu tagIds: [1, 3, 5] vào cột array.

Cách sử dụng trên giao diện

  1. Mở form bản ghi → field M2M Array hiển thị dạng multi-select.
  2. Chọn một hoặc nhiều record từ target collection.
  3. Lưu — danh sách ID được lưu vào cột array.
  4. Khi xem bản ghi, hệ thống tự resolve IDs thành tên/label của target record.

Nested create — Tạo target record mới trong lúc chọn

Nếu target record chưa tồn tại, có thể tạo mới ngay trong quá trình chọn:

typescript
await repository.create({
  values: {
    title: 'Bài viết mới',
    tags: [
      { id: 3 },
      { name: 'Tag mới' },
    ],
  },
});

Hệ thống sẽ tạo "Tag mới" trong collection tags, lấy ID, rồi lưu vào cột array.

Cột lưu trữ trong database

DatabaseColumn typeVí dụ giá trị
PostgreSQLARRAY (native){1,3,5}
MySQLJSON[1,3,5]
SQLiteJSONB hoặc TEXT[1,3,5]

Lưu ý

  • Không có bảng junction — không lưu được metadata trên mỗi quan hệ.
  • Với PostgreSQL, ARRAY column cho hiệu năng tốt nhất. MySQL/SQLite dùng JSON, hiệu năng query kém hơn.
  • FK integrity được kiểm tra bởi hook, không phải DB constraint — nếu thao tác trực tiếp DB, cần tự đảm bảo.