اذهب إلى المحتوى
  • 0

كيف أربط بين جدوال قاعدة البيانات بعلاقة الكثير للكثير many to many باستخدام مكتبة sequelize

Mohamed Lamin Mahmoudi

السؤال

أريد أن أربط بين النموذجين  Room و User بعلاقة many to many كيف يتم ذلك ؟

room.js

const room =(sequelize,DataTypes)=>{
    const Room =sequelize.define('room',{
     Numberofroom:{
         type:DataTypes.STRING,
     },
    NameOfroom:{
        type:DataTypes.STRING,
    },
    QrCodevalue:{
        type:DataTypes.STRING,
        unique:true,
    },
    date:{
        type:DataTypes.DATE,
    }
    
    });
    return Room;
    
    
    
    }
    
    
    export default room;

user.js

import Sequelize from 'sequelize';

const user =(sequelize,DataTypes)=>{
  const User =sequelize.define('user',{
   name:{
       type:DataTypes.STRING,
   } ,
   email:{
       type:DataTypes.STRING,
       unique:true,
   },
  password:{
      type:DataTypes.STRING,
  },
  userType:{
      type:DataTypes.ENUM('teacher','student')
  }
  

  });
  //نربط هذا النموذج بالنموذج بروفايل 
  User.associate=models=>{
User.hasOne(models.Profile);
  }
  return User ;

}
 
export default user;

index.js

import Sequelize from 'sequelize';


const sequelize = new Sequelize(

    process.env.DB,
    process.env.DB_User,
    process.env.DB_pass,
    {
        dialect:'postgres'
    }
);
const models={
    User:sequelize.import('./user'),
    Profile:sequelize.import('./profile'),
    Room:sequelize.import('./room')

}
Object.keys(models).forEach(key=>{
if('associate'in models[key]){
    models[key].associate(models);
}

});


sequelize.authenticate()
.then(()=>{
    console.log('connection  has been estbileshed succsefully');
})
.catch(err=>{
    console.log('Unabel to connect to the data base');
});

export {sequelize};
export default models;
 

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

في sequelize يمكننا عمل علاقة من نوع many-to-many عبر إستخدام الدالة belongsToMany لدى كلا الطرفين, كما يتضح من الشفرة التالية في دالة associate 

User.associate=models=>{
	User.hasOne(models.Profile);
	User.belongsToMany(models.Room)
  }
Room.associate = models=>{
	Room.belongsToMany(models.User)
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 14 دقائق مضت قال شرف الدين2:

في sequelize يمكننا عمل علاقة من نوع many-to-many عبر إستخدام الدالة belongsToMany لدى كلا الطرفين, كما يتضح من الشفرة التالية في دالة associate 


User.associate=models=>{
	User.hasOne(models.Profile);
	User.belongsToMany(models.Room)
  }

Room.associate = models=>{
	Room.belongsToMany(models.User)
}

 

أنا أريد من خلال هاته العلاقة أن يتم إنشاء جدول ثالث أدخل فيه إسم ورقم المستخدم من نموذج المستخدمين وإسم الحصة من نموذد الحصص كما في الصورة هل هاته الطريقة تفي بالغرض؟

room.PNG

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 25 دقائق مضت قال Mohamed Lamin Mahmoudi:

أنا أريد من خلال هاته العلاقة أن يتم إنشاء جدول ثالث أدخل فيه إسم ورقم المستخدم من نموذج المستخدمين وإسم الحصة من نموذد الحصص كما في الصورة هل هاته الطريقة تفي بالغرض؟

 

أجل ويمكنك تحديد إسم الجدول الثالث عبر الخاصية  through كما يظهر من الشفرة التالية 

User.associate=models=>{
User.hasOne(models.Profile);
User.belongsToMany(models.Room,{through:"name of third table"}) }
Room.associate = models=>{
  Room.belongsToMany(models.User,{through:'name of third table'})
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 5 ساعات قال شرف الدين2:

أجل ويمكنك تحديد إسم الجدول الثالث عبر الخاصية  through كما يظهر من الشفرة التالية 


User.associate=models=>{
User.hasOne(models.Profile);
User.belongsToMany(models.Room,{through:"name of third table"}) }

Room.associate = models=>{
  Room.belongsToMany(models.User,{through:'name of third table'})
}

 

و كيف أحدد خواص هذا الجدول ؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 3 ساعات قال Mohamed Lamin Mahmoudi:

و كيف أحدد خواص هذا الجدول ؟

حاولت أن أضع خواص للجدول الثالث الذي أنشأته 

import Sequelize from 'sequelize';
const listRoom = Sequelize.define('ListRoom',{
    numberofRoom:{
        type:DataTypes.INTEGER,
       },
      NameUser :{
           type:DataTypes.STRING,
       },
     NumberUser:{
         type:DataTypes.INTEGER
     }
}    
);

export default listRoom;
Room.associate = models=>{
        Room.belongsToMany(models.User,{through:'ListRoom'})
      }
    return Room;
    
User.associate=models=>{
  User.hasOne(models.Profile);
  User.belongsToMany(models.Room,{through:"ListRoom"}) }
  return User ;

هذا ماظهر لي 

Capture.PNG

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 4 ساعات قال Mohamed Lamin Mahmoudi:

هذا ماظهر لي 

سبب الخطأ هو عدم تضمين صنف الخواص DataTypes من مكتبة sequelize

const { DataTypes , sequelize } = require("sequelize"); 

DataTypes.INTEGER  هنا تصبح تعمل

ربما تختلف حسب إصدار المكتبة لديك.

يمكنك تعريف الجدول الوسيط من خلال نموذج مثل أي نموذج آخر.. ويتم الربط من خلال تمريراسم النموذج للنماذج المرتبطة به من خلال through وتأكد من تطابق الأسماء

مثلاً في المباراة أكثر من فريق، وكل فريق يلعب أكثر من مباراة تكون العلاقة:

const GameTeam = sequelize.define('GameTeam', {
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true,
  }
});
Team.belongsToMany(Game, { through: GameTeam });
Game.belongsToMany(Team, { through: GameTeam });
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 9 ساعات قال Wael Aljamal:

سبب الخطأ هو عدم تضمين صنف الخواص DataTypes من مكتبة sequelize


const { DataTypes , sequelize } = require("sequelize"); 

DataTypes.INTEGER  هنا تصبح تعمل

ربما تختلف حسب إصدار المكتبة لديك.

يمكنك تعريف الجدول الوسيط من خلال نموذج مثل أي نموذج آخر.. ويتم الربط من خلال تمريراسم النموذج للنماذج المرتبطة به من خلال through وتأكد من تطابق الأسماء

مثلاً في المباراة أكثر من فريق، وكل فريق يلعب أكثر من مباراة تكون العلاقة:


const GameTeam = sequelize.define('GameTeam', {
  id: {
    type: DataTypes.INTEGER,
    primaryKey: true,
  }
});
Team.belongsToMany(Game, { through: GameTeam });
Game.belongsToMany(Team, { through: GameTeam });

يعني في هذه الحالة الجدول الثالث يحتوي فقط على خاصيتين مثلا إسم الفريق والمباراة التي لعبها فقط 

* في حالتي عندي الطالب ممكن أن يسجل في أكثر من حصة والحصة ممكن أن يكون فيها أكثر من طالب 

أنا أريد أن أجلب كل الطلبة الذين ينتمون لحصة ما مثلا حصة الرياضيات فيها طالبين أريد أن أعرض إسم الحصة مع الطالبين الذين ينتمون إليها كما في الصورة أعلاه  ؟

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ منذ ساعة مضت قال Mohamed Lamin Mahmoudi:

يعني في هذه الحالة الجدول الثالث يحتوي فقط على خاصيتين مثلا إسم الفريق والمباراة التي لعبها فقط 

* في حالتي عندي الطالب ممكن أن يسجل في أكثر من حصة والحصة ممكن أن يكون فيها أكثر من طالب 

أنا أريد أن أجلب كل الطلبة الذين ينتمون لحصة ما مثلا حصة الرياضيات فيها طالبين أريد أن أعرض إسم الحصة مع الطالبين الذين ينتمون إليها كما في الصورة أعلاه  ؟

في علاقة الكثير لكثير، كل سجل أو وثيقة تحوي ثنائية أو أكثر من الخواص

GameTeam   team_1_id team_2_id   date score .. 
   1          1          2           
   2          2          3 
   3          2          3

لاحظ أن لكل مباراة معلوماتها الكاملة، من الفرق المشاركة و التاريخ و النتيجة ..

أي سطر في الجدول يعبر عن مباراة

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 21 ساعات قال Wael Aljamal:

في علاقة الكثير لكثير، كل سجل أو وثيقة تحوي ثنائية أو أكثر من الخواص


GameTeam   team_1_id team_2_id   date score .. 
   1          1          2           
   2          2          3 
   3          2          3

لاحظ أن لكل مباراة معلوماتها الكاملة، من الفرق المشاركة و التاريخ و النتيجة ..

أي سطر في الجدول يعبر عن مباراة

حاولت الربط لكن لم يظهر لي الجدول في قاعدة البيانات ؟؟ 

الملف هو Listclass

backend.rar

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 4 ساعات قال Mohamed Lamin Mahmoudi:

حاولت الربط لكن لم يظهر لي الجدول في قاعدة البيانات ؟؟ 

الملف هو Listclass

backend.rar

كنت تربط العلاقات في النماذج الخطأ. ولا تقوم بتصدير النموذج

index.js

ListClass.js

profile.js

room.js

User.js

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...