ГДЕ ИЛИ ГДЕ ЧЕРЕЗ Sequelize - PullRequest
       4

ГДЕ ИЛИ ГДЕ ЧЕРЕЗ Sequelize

0 голосов
/ 26 февраля 2020

поэтому у меня есть 3 таблицы: Пост , Сводка , Категория

в таблице Пост есть поле для главной категории = main_category_id сообщение может иметь по одной главной категории за раз.

, а затем таблица Pivot служит основой для вторичной категории, которую может разместить публикация иметь более 1.

полей в Pivot

  • post_id
  • category_id

Я пытаюсь чтобы получить Post , где main_category = id или где у оси есть category_id = id

Текущий код:

var mainPost = await models.t_post.findAll({
        where:{
            main_category_id:main.id
        },
        include: [{
            model: models.m_category,
            as:"secondary_category",
            through: { 
                where: {category_id: main.id},
            },
            attributes: ['id']
        }],
        order:[
            ['createdAt',"desc"]
        ],
        limit:limit,
        offset:3+(limit*page)-limit,
    })

РЕДАКТИРОВАТЬ: Добавлены модели

Пост модель

module.exports = (sequelize, DataTypes) => {
  const T_Post = sequelize.define('t_post', {
    user_id: DataTypes.INTEGER,
    title: DataTypes.STRING,
    subtitle: DataTypes.STRING,
    content: DataTypes.TEXT,
    excerpt: DataTypes.TEXT,
    thumbnail: DataTypes.STRING,
    thumbnail_caption: DataTypes.STRING,
    slug: DataTypes.STRING,
    permalink: DataTypes.STRING,
    template: DataTypes.INTEGER,
    published: DataTypes.BOOLEAN,
    published_date: DataTypes.DATE, 
  }, {
    timestamps: true,
    paranoid:true,
    underscored: true,
    freezeTableName: true,
    tableName: 't_post',
    paranoid: true,
  });
  return T_Post;
};

Модель Pivot

module.exports = (sequelize, DataTypes) => {
  const m_post_category = sequelize.define('m_post_category', {
    category_id: DataTypes.INTEGER,
    post_id: DataTypes.INTEGER,
  }, {
    timestamps: true,
    paranoid:true,
    underscored: true,
    freezeTableName: true,
    tableName: 'm_post_category'
  });
  return m_post_category;
};

Категория Модель

module.exports = (sequelize, DataTypes) => {
  const m_category = sequelize.define('m_category', {
    name: DataTypes.STRING,
    slug: DataTypes.STRING,
    template_id: DataTypes.STRING,
    is_active: DataTypes.BOOLEAN,
    has_title: DataTypes.BOOLEAN,
    has_sub_menu: DataTypes.BOOLEAN,
  }, {
    timestamps: true,
    paranoid:true,
    underscored: true,
    freezeTableName: true,
    tableName: 'm_category'
  });
  return m_category;
};

Ассоциация

//Get Main category in this post
t_post.belongsTo(m_category,{
  foreignKey:"main_category_id",
  as:"main_category"
})

//Get secondary category in this post
t_post.belongsToMany(m_category,{
  through: m_post_category,
  as: 'secondary_category',
  foreignKey: 'post_id'
})

//Get post that have this category as secondary category
m_category.belongsToMany(t_post,{
  through: m_post_category,
  as: 'article_as_secondary',
  foreignKey: 'category_id'
})

//Eager Loading get post with this category **category.posts**
m_category.hasMany(t_post,{
  as:"posts",
  foreignKey:"main_category_id"
})

1 Ответ

0 голосов
/ 26 февраля 2020

Пожалуйста, обратитесь к следующему коду для фильтрации записей, как вы хотите -

  const mainPost = await models.t_post.findAll({
    //  where:{
    //      main_category_id:main.id
    //  },
    include: [
      {
        model: models.m_category,
        as: 'secondary_category',
        //  through: {
        //      where: {category_id: main.id},
        //  },
        attributes: ['id']
      }
    ],
    where: {
      [op.or]: [
        db.sequelize.literal(`\`t_post\`.\`main_category_id\` = ${main.id}`),
        db.sequelize.literal(`\`m_category\`.\`category_id\` = ${main.id}`)
      ]
    },
    order: [['createdAt', 'desc']],
    limit: limit,
    offset: 3 + limit * page - limit
  });

Надеюсь, это поможет!

...