2016-09-28 2 views
1

Я пытаюсь соединить две таблицы с использованием Sequelize включит как таковые:доступа внутреннего соединение данных из sequelize с использованием включают

models.user.findAll({include: {model: models.boardMember, required:true}}) 
    .then(function(board) { 
     console.log(board); 
     res.render('contact', { title: 'Kontakt', board: board }); 
    }); 

Моих моделей выглядеть следующим образом, используя sequelize express example:

пользователя (это не вполне чувствовать себя имея hasMany здесь, а не в boardMembers, но я не хочу иметь ключевое поле иностранного в таблице пользователей)

module.exports = function(sequelize, DataTypes) { 
    var user = sequelize.define('user', { 
    //lots of normal user fields(username, password, access... 
    }, { 
    classMethods: { 
     associate: function(models) { 
     user.hasMany(models.boardMember, { 
      foreignKey: { 
      allowNull: false 
      } 
     }); 
     } 
    } 
    }); 

    return user; 
}; 

boardMember

module.exports = function(sequelize, DataTypes) { 
    var boardMember = sequelize.define('boardMember', { 
    post: { 
     type: DataTypes.STRING, 
     unique: false, 
     allowNull: false 
    } 
    }); 
    return boardMember; 
}; 

Затем я хочу, чтобы получить доступ к данным, возвращаемые в таблице с помощью рулей:

{{#each board}} 
    <tr> 
    <td>{{boardMembers.post}}</td> 
    <td>{{firstName}} {{surName}}</td> 
    <td>{{email}}</td> 
    </tr> 
{{/each}} 

Вот где я получаю это неправильно (я думаю). Появляются имена и адрес электронной почты, но не почта. Я пробовал использовать только сообщение, но безрезультатно. Это странно, потому что я думаю, что запрос, который генерируется, выглядит так (я удалил createdAt и updatedAt столбцы, чтобы сделать его короче для вас читать):

SELECT 
    `user`.`id`, `user`.`username`, `user`.`password`, 
    `user`.`firstName`, `user`.`surName`, `user`.`email`, `user`.`access`, 
    `boardMembers`.`id` AS `boardMembers.id`, `boardMembers`.`post` AS `boardMembers.post`, 
    `boardMembers`.`userId` AS `boardMembers.userId` 
FROM 
    `users` AS `user` 
INNER JOIN 
    `boardMembers` AS `boardMembers` ON `user`.`id` = `boardMembers`.`userId`; 

console.log выдает что-то вроде этого (данные очевидно, изменилось):

[ Instance { 
dataValues: 
{ id: 2, 
    username: 'username', 
    password: 'hashedPassword', 
    firstName: 'User', 
    surName: 'Name', 
    email: '[email protected]', 
    access: '0', 
    boardMembers: [Object] }, 
... 
] 

Любая помощь много оценен по достоинству!

Спасибо,

Freece

ответ

0

согласно sequelize documentation значение для включения атрибута является список.

Вы можете попробовать при необходимости: include: [{ all: true, nested: true }] и посмотреть, подходит ли оно для вас.

Кроме того, у вас возникла проблема с вашим шаблоном, потому что вы установили отношение одного к большому, и поэтому атрибут экземпляра модели - это массивы.

+0

Хм, к сожалению, это не сработало. Пробовал использовать это: 'models.user.findAll ({include: [{nested: true, all: true, model: models.boardMember, required: true}]})' и несколько разных версий. Спасибо за подсказку! – Freece

+0

с указанием модели не требуется, если вы используете опцию all: true. И из того, что я вижу из вашего вопроса, вы извлекаете связанный с ним boardMemebers ('boardMembers: [Object]' в массиве ответов), но в вашем шаблоне вы обрабатываете атрибут boardMember, как если бы он содержал один объект, но отношение было множественным – yeiniel

+0

Да, вы правы. Я думал об этом неправильно. Я понял, что мне нужно создать собственный помощник для HandleBars. – Freece

Смежные вопросы