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

كيفية إستخدام دالة COUNT مع علاقة كثير لكثير sequelize

Ahmed Yehia2

السؤال

 ازاي اجيب عدد الassosiactions في علاقة many to many في sequelize

Post.belongsToMany(models.User, { as: 'UserLikes', through: models.likes, foreignKey: 'postId' });

User.belongsToMany(models.Project, { as: 'UserLikes', through: models.likes, foreignKey: 'userId' });

 

تم التعديل في بواسطة شرف الدين2
توضيح العنوان وتنسيق الشفرة البرمجية
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

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

select COUNT(UserLikes.PostId) from Post left join UserLikes on Post.id = UserLikes.PostId

وفي حالة أردنا عرض المنشور وبجانبه عدد المعجبين يمكننا إستخدام الدالة count مع الدالة group by لأن بدون إستخدام group by سيتم عرض فقط المنشورات التي لديها معجبين, ويمكننا تمثيل ذلك بكود sql كالتالي 

select Post.*, COUNT(UserLikes.PostId) from Post left join UserLikes on Post.id = UserLikes.PostId group by Post.id

حيث يتم عرض جميع المنشورات حسب الid الخاص بهم بالإضافة إلى عدد المُعجبين, ويمكننا تنفيذ الشفرات السابقة إلى أكواد sequelize كالتالي

  1. const posts = await Post.findAll({
    
             attributes:[
                [Sequelize.fn("COUNT", Sequelize.col("UserLikes.id")), "likes"]
             ],
             include:{model:User,as:"UserLikes" , attributes:[]},
    
             group: ['Post.id'],
             subQuery: false,
                
                limit: limit,
                offset: limit * pageNo
            })

    كما تلاحظ قمنا في خانة attributes بوضع attribute واحد فقط وهو مجموع الحقل UserLikes.id لنعلم كم إعجاب لكل منشور حسب ظهور المُعرف الخاص بالمُعجب, كما إستخدمنا أيضًا subQuery ب false حتى نجعل الشفرة تعمل كما بالأعلى حتى لا يتم إستبدال الjoin  ب subquery 

  2. const posts = await Post.findAll({
    
             attributes:{
                include:[[Sequelize.fn("COUNT", Sequelize.col("UserLikes.id")), "likes"]]
             },
             include:{model:User,as:"UserLikes" , attributes:[]},
    
             group: ['Post.id'],
             subQuery: false,
                
                limit: limit,
                offset: limit * pageNo
            })

    الفرق الوحيد أننا قمنا بتغيير خاصية attributes بدلًا من وضعها على هيئة مصفوفة قمنا بوضعها على هيئة كائن, حيث إن وضعناها على هيئة مصفوفة سيقوم بجلب العناصر التي في المصفوفة فقط, بينما إن قمنا بوضعها على هيئة كائن سيقوم بجلب العناصر جميعها بالإضافة إلى الحقل في الخاصية include 

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...