Giao diện
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 Array | Dùng M2M truyền thống |
|---|---|---|
| Số lượng target | Nhỏ-trung bình (< 100 per record) | Lớn hoặc không giới hạn |
| Metadata trên quan hệ | Không cần | Cần (ví dụ: role, sort order) |
| Database | PostgreSQL (tốt nhất) | Mọi DB |
| Độ phức tạp query | Đơn giản | Phức tạp nhưng linh hoạt |
Thêm field belongsToArray
- Mở Collection Manager → chọn collection nguồn (source).
- Thêm field mới → chọn interface M2M (Array).
- Cấu hình:
| Thuộc tính | Mô tả | Ví dụ |
|---|---|---|
| target | Collection đích | tags |
| foreignKey | Tên cột array trên source | tagIds |
| targetKey | Primary key trên target | id |
- 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→ fieldtags(belongsToArray) - Target:
tags(cần có collectiontagsvới primary keyid)
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
- Mở form bản ghi → field M2M Array hiển thị dạng multi-select.
- Chọn một hoặc nhiều record từ target collection.
- Lưu — danh sách ID được lưu vào cột array.
- 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
| Database | Column type | Ví dụ giá trị |
|---|---|---|
| PostgreSQL | ARRAY (native) | {1,3,5} |
| MySQL | JSON | [1,3,5] |
| SQLite | JSONB 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.