2015-09-25 4 views
1

Я пытаюсь использовать язык запросов Sails для запроса двух таблиц, с Postgresql в качестве базы данных.Может ли Sails запрашивать две таблицы одновременно?

У меня есть две таблицы «Человек» и «ПЭТ».

Для «Персона», ее модель:

id: { type: 'integer', primaryKey } 
namePerson: { type: 'string' } 
age: { type: 'integer' } 

Для «Pet», его модель:

id: { type: 'integer', primaryKey } 
owner: { model: 'Person' } 
namePet: { type: 'string' } 

Я хочу, чтобы найти всех домашних животных, которые находятся в собственности людей моложе 12, и я хочу сделать это в одном запросе. Это возможно?

Я знаю только, как это сделать в двух запросах. Во-первых, найти все люди, которые моложе 12 лет:

Person.find({age: {'<', 12}}).exec(function (err, persons) {..}; 

Затем найти всех домашних животных, принадлежащих им:

Pet.find({owner: persons}).exec(...) 

ответ

2

Вы должны здесь one-to-many association (один человек может иметь несколько домашних животных).

Ваше лицо должно быть связано с домашним животным:

module.exports = { 

    attributes: { 
     // ... 
     pets:{ 
      collection: 'pet', 
      via: 'owner' 
     } 
    } 
} 

Ваши домашние животные должны быть связаны с человеком:

module.exports = { 

    attributes: { 
     // ... 
     owner:{ 
      model:'person' 
     } 
    } 
} 

Вы все еще можете найти пользователя по возрастным критериям:

Person 
    .find({age: {'<', 12}}) 
    .exec(function (err, persons) { /* ... */ }); 

Чтобы получить пользователя с домашними животными, вы должны заполнить ассоциацию:

Person 
    .find({age: {'<', 12}}) 
    .populate('pets') 
    .exec(function(err, persons) { 
     /* 
     persons is array of users with given age. 
     Each of them contains array of his pets 
     */ 
    }); 

паруса позволяют выполнять несколько населения в одном запросе, как:

Person 
    .find({age: {'<', 12}}) 
    .populate('pets') 
    .populate('children') 
    // ... 

Но вложенные населения не существует, выпуск discussion here.

+0

благодарю вас за ответ. Это объясняет очень хорошо. Еще один вопрос. Я обнаружил, что запрос: Person.find ({age: {'<', 12}}). Populate ('pets') также возвращает людей, которых нет домашних животных, т. Е. {... pets: [] ...}. Можно просто вернуть людей с хотя бы одним домашним животным? Благодарю. – JustWonder

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