وجود این نوع داده توی postgres و mysql کار رو خیلی ساده کرده.
فرض کن یه جدول cars داری که میخوای رنگ هاشون رو هم براشون بنویسی:
create table color( id serial primary key, name text ); create table cars ( brand text, model text, color integer references color(id) ); insert into color(name) values ('blue'), ('red'), ('gray'), ('black'); insert into cars(brand, model, color) select brand, model, color.id from ( values('ferari', 'testarosa', 'red'), ('aston martin', 'db2', 'blue'), ('bentley', 'mulsanne', 'gray'), ('ford', 'T', 'black') ) as data(brand, model, color) join color on color.name = data.color;
نکته: توی کوئری بالا به جای استفاده مستقیم از شماره رنگ اومدیم از مقدارش به صورت مستقیم استفاده کردهایم. این تکنیک رو INSERT … SELECT میگن، وقتی این کار رو میکنی خودش میره توی جدول reference دنبال رکورد میگرده.
خب حالا این بحث ها به کنار، وقتی میخوای رکورد های جدول cars رو به کاربر بدی باید چجوری کوئری بزنی؟
select brand, model, color.name as color from cars join color on color.id = cars.color;
خب همون جوری که میبینی داری یه join به خاطر یه اسم میزنی. چه کاریه؟ خب بیا enum تعریفش بکن و خودتو راحت بکن.
create type color_t as enum('blue', 'red', 'gray', 'black'); drop table if exists cars; create table cars( brand text, model text, color color_t ); insert into cars(brand, model, color) values ('ferari', 'testarosa', 'red'), ('aston martin', 'db2', 'blue'), ('bentley', 'mulsanne', 'gray'), ('ford', 'T', 'black');
خب به همین راحتی بدون تعریف یه جدول دیگه تونستی کارتو راه بندازی. حالا جزئیات دقیق تر:
خب به عنوان اولین نکته اینو در نظر بگیر که این قابلیت فقط روی postgres قابل پیاده سازی هست. برای اینکه یه فیلدی رو به صورت enum در نظر بگیری میتونی وقتی مدل رو داری تعریف میکنی بیای نوعش رو enum بزاری.
const { Model, DataTypes } = require('sequelize'); class Test extends Model {}; Test.init({ f1: { type: DataTypes.ENUM('v1', 'v2', 'v3'), defaultValue: 'v1' } }, {}); module.exports = Test;
خب حالا وقتی میخوای رکورد توی دیتابیس ثبت بکنی باید اینجوری عمل بکنی:
Test.create({ f1: 'v1' });
و برای اینکه مقادیر اون enum رو بگیری باید اینجوری عمل بکنی:
console.log(Test.rawAttributes.f1.values); // [ 'v1', 'v2', 'v3' ]
با تشکر از توجه و کامنتای نوشته/نانوشته شما :)