নোড.জেএস-এ সিকেলাইজ ব্যবহার করে কীভাবে যোগদানের ক্যোয়ারী তৈরি করবেন


104

আমি সিক্যুয়ালাইজ ওআরএম ব্যবহার করছি; সবকিছু দুর্দান্ত এবং পরিষ্কার, তবে আমি যখন সমস্যাগুলি নিয়ে এটি ব্যবহার করি তখন আমার একটি সমস্যা হয়েছিল join। আমার দুটি মডেল রয়েছে: ব্যবহারকারী এবং পোস্ট।

var User = db.seq.define('User',{
    username: { type: db.Sequelize.STRING},
    email: { type: db.Sequelize.STRING},
    password: { type: db.Sequelize.STRING},
    sex : { type: db.Sequelize.INTEGER},
    day_birth: { type: db.Sequelize.INTEGER},
    month_birth: { type: db.Sequelize.INTEGER},
    year_birth: { type: db.Sequelize.INTEGER}

});

User.sync().success(function(){
    console.log("table created")
}).error(function(error){
    console.log(err);
})


var Post = db.seq.define("Post",{
    body: { type: db.Sequelize.TEXT },
    user_id: { type: db.Sequelize.INTEGER},
    likes: { type: db.Sequelize.INTEGER, defaultValue: 0 },

});

Post.sync().success(function(){
    console.log("table created")
}).error(function(error){
    console.log(err);
})

আমি এমন একটি ক্যোয়ারী চাই যা ব্যবহারকারীর তথ্যের সাথে একটি পোস্টের সাথে সাড়া দেয়। কাঁচা ক্যোয়ারিতে, আমি এটি পেয়েছি:

db.seq.query('SELECT * FROM posts, users WHERE posts.user_id = users.id ').success(function(rows){
            res.json(rows);
        });

আমার প্রশ্ন হল আমি কীভাবে এসকিউএল কোয়েরির পরিবর্তে ওআরএম স্টাইলটি ব্যবহার করতে কোডটি পরিবর্তন করতে পারি?

উত্তর:


129
User.hasMany(Post, {foreignKey: 'user_id'})
Post.belongsTo(User, {foreignKey: 'user_id'})

Post.find({ where: { ...}, include: [User]})

যা আপনাকে দেবে

SELECT
  `posts`.*,
  `users`.`username` AS `users.username`, `users`.`email` AS `users.email`,
  `users`.`password` AS `users.password`, `users`.`sex` AS `users.sex`,
  `users`.`day_birth` AS `users.day_birth`,
  `users`.`month_birth` AS `users.month_birth`,
  `users`.`year_birth` AS `users.year_birth`, `users`.`id` AS `users.id`,
  `users`.`createdAt` AS `users.createdAt`,
  `users`.`updatedAt` AS `users.updatedAt`
FROM `posts`
  LEFT OUTER JOIN `users` AS `users` ON `users`.`id` = `posts`.`user_id`;

আপনি যে পোস্ট করেছেন তার তুলনায় উপরের ক্যোয়ারীটি কিছুটা জটিল দেখায়, তবে এটি যা করে তা কেবলমাত্র ব্যবহারকারীদের সারণীর সমস্ত কলামই আলাদা করে দেয় তা নিশ্চিত করার জন্য যে তারা ফিরে আসবে এবং পোস্টের মডেলটির সাথে মিশে না যায় তা সঠিক মডেলটিতে স্থাপন করা হয়েছে make

এটি বাদে আপনি লক্ষ্য করবেন যে এটি দুটি সারণী থেকে বাছাইয়ের পরিবর্তে একটি যোগদান করে, তবে ফলাফলটি একই হওয়া উচিত

আরও পড়া:


7
আমি যদি কেবল 1984 সালে জন্মগ্রহণকারী ব্যবহারকারীদের সাথে যোগ দিতে চাই তবে কী হবে? এসকিউএল-এ আমি করব:SELECT * FROM posts JOIN users ON users.id = posts.user_id WHERE users.year_birth = 1984
ইওয়াজারু

1
সমস্ত লিঙ্কগুলি মৃত নয় :-(
মানওয়াল

1
এই প্রশ্নটি কি কোনও উত্তর দেওয়া প্রশ্নে পোস্ট করা হয়েছে?
theptrk

1
আমাদের উভয়ের উভয়েরই দরকার বা একটিই যথেষ্ট: ইউজার.হসমানি (পোস্ট, {বিদেশী কী: 'ইউজার_আইডি'}) পোস্ট.বেলংটো (ইউজার, {বিদেশীকি: 'ইউজার_আইডি'})
পূর্বে

1
@ অ্যান্টিউ আপনি যখন কল করবেন তখন আপনি User.hasMany(Post)ব্যবহারকারীর অবজেক্টে পদ্ধতি / বৈশিষ্ট্য যুক্ত করুন এবং যখন আপনি কল Post.belongsTo(User)করবেন তখন পোস্ট ক্লাসে পদ্ধতি যুক্ত করুন। আপনি যদি সর্বদা এক দিক থেকে কল করেন (উদাঃ ব্যবহারকারী.জেটপোস্ট ()) তবে আপনাকে পোস্ট অবজেক্টে কিছু যুক্ত করার দরকার নেই। তবে উভয় পক্ষের পদ্ধতিগুলি খুব ভাল।
রায়ান শিলিংটন

170

গৃহীত উত্তরটি প্রযুক্তিগতভাবে ভুল না হলেও, এটি মূল প্রশ্নের উত্তর দেয় না বা মন্তব্যে ফলো আপ প্রশ্নের উত্তর দেয় না, যা আমি এখানে খুঁজছিলাম। তবে আমি এটি বুঝতে পেরেছি, তাই এখানে যায়।

আপনি যদি সমস্ত পোস্ট ব্যবহারকারীদের (এবং কেবলমাত্র ব্যবহারকারীদের সাথে থাকে) সন্ধান করতে চান তবে এসকিউএল দেখতে এই রকম দেখাবে:

SELECT * FROM posts INNER JOIN users ON posts.user_id = users.id

যা শব্দার্থগতভাবে ওপির মূল এসকিউএল একই জিনিস:

SELECT * FROM posts, users WHERE posts.user_id = users.id

তাহলে আপনি এটি চান:

Posts.findAll({
  include: [{
    model: User,
    required: true
   }]
}).then(posts => {
  /* ... */
});

সত্যের প্রয়োজন নির্ধারণ করা অভ্যন্তরীণ যোগদানের মূল চাবিকাঠি। আপনি যদি কোনও বাম বাহ্যিক যোগদান চান (যেখানে আপনি কোনও লিঙ্কযুক্ত থাকুক না কেনই আপনি সমস্ত পোস্ট পাবেন) তারপরে মিথ্যাতে প্রয়োজনীয় পরিবর্তন করুন, বা এটি ডিফল্ট হওয়ার কারণে ছেড়ে দিন:

Posts.findAll({
  include: [{
    model: User,
//  required: false
   }]
}).then(posts => {
  /* ... */
});

আপনি যদি জন্মের বছর 1984 এর ব্যবহারকারীদের সাথে সম্পর্কিত সমস্ত পোস্ট খুঁজে পেতে চান তবে আপনি চাইবেন:

Posts.findAll({
  include: [{
    model: User,
    where: {year_birth: 1984}
   }]
}).then(posts => {
  /* ... */
});

মনে রাখবেন যে ডিফল্টরূপে আপনি যেখানে কোনও ক্লজ যুক্ত করেছেন তা আবশ্যকই সত্য।

আপনি যদি কোনও ব্যবহারকারী সংযুক্ত থাকেন কিনা তা বিবেচনা করেই যদি আপনি সমস্ত পোস্ট চান তবে তবে যদি সেখানে কোনও ব্যবহারকারী থাকে তবে কেবল 1984 সালে জন্মগ্রহণকারী পোস্টগুলি পরে প্রয়োজনীয় ক্ষেত্রটি এখানে যুক্ত করুন:

Posts.findAll({
  include: [{
    model: User,
    where: {year_birth: 1984}
    required: false,
   }]
}).then(posts => {
  /* ... */
});

আপনি যদি এমন সমস্ত পোস্ট চান যেখানে নামটি "রৌদ্র" হয় এবং কেবল এটি যদি 1984 সালে জন্ম নেওয়া কোনও ব্যবহারকারীর হয় তবে আপনি এটি করতে পারেন:

Posts.findAll({
  where: {name: "Sunshine"},
  include: [{
    model: User,
    where: {year_birth: 1984}
   }]
}).then(posts => {
  /* ... */
});

আপনি যদি এমন সমস্ত পোস্ট চান যেখানে নামটি "সানশাইন" রয়েছে এবং কেবলমাত্র যদি এটি কোনও ব্যবহারকারীর সাথে সম্পর্কিত যেটি পোস্টে পোস্ট_ইয়ার বৈশিষ্ট্যের সাথে একই বছর জন্মগ্রহণ করেছে তবে আপনি এটি করতে চাইবেন:

Posts.findAll({
  where: {name: "Sunshine"},
  include: [{
    model: User,
    where: ["year_birth = post_year"]
   }]
}).then(posts => {
  /* ... */
});

আমি জানি, এটা বোঝা যায় না যে তারা জন্মের সময় যে কেউ একটি পোস্ট দেবে, তবে এটি কেবল একটি উদাহরণ - এটির সাথে যান। :)

আমি এই দস্তাবেজ থেকে এটিকে বেশিরভাগই খুঁজে পেয়েছি:


9
আপনাকে অনেক ধন্যবাদ, এটি দরকারী ছিল
নিও

6
হ্যাঁ, দুর্দান্ত উত্তর
ডক্সফক্স--

সুতরাং posts.user_id = users.idআপনার সিক্যুয়ালাইজ মধ্যে উপস্থাপন কি ? ধন্যবাদ
হাঞ্জিচি

5
এই উত্তরটি এতই বিস্তৃত যে এটি সিকিলাইজের ডকের সাথে যুক্ত করা উচিত
জর্জিও আন্দ্রেটি

2
টিউটোরিয়ালের দুর্দান্ত অংশ যা আমি সন্ধান করছি been অনেক ধন্যবাদ
অ্যান্ড্রু রায়ান


2

আমার ক্ষেত্রে আমি নিম্নলিখিত জিনিস করেছি। ইউজারমাস্টারে ইউজারআইডি পিকে এবং ইউজারঅ্যাক্সেসে ইউজারআইডি ইউজারমাস্টারের এফকে হয়

UserAccess.belongsTo(UserMaster,{foreignKey: 'userId'});
UserMaster.hasMany(UserAccess,{foreignKey : 'userId'});
var userData = await UserMaster.findAll({include: [UserAccess]});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.