Как сделать find()/where() в связанных моделях

Я играю с ассоциациями моделей в парусах, и мне любопытно, можно ли сделать запрос на основе связанного поля.

Пример:

User.js
 attributes:{
  classes: { collection: 'Class', via: 'students' }
 }
Class.js
 attributes: {
  type: ...
  students: { collection: 'User', via: 'classes'}
 }

Есть ли способ получить определенные классы студента на основе типа класса, потому что сейчас все возвращается, когда я использую .populate(). (возможно, похоже на логику ниже)

User
 .findOne({name: 'StudentA'})
 .populate('classes')
 .where({'classes.type':['type1', 'type2']})
 .then(....)

Спасибо


person ginad    schedule 06.04.2014    source источник
comment
Не очень полезно для вашего вопроса ... Но если вы используете многие ко многим, я считаю, что вам нужно указать dominant:true на одной стороне отношения.   -  person InternalFX    schedule 06.04.2014
comment
Начиная с версии 0.10-rc5, dominant требуется только в том случае, если модели используют разные соединения.   -  person sgress454    schedule 07.04.2014


Ответы (1)


Вы можете добавить предложение where к вашему populate следующим образом:

User
 .findOne({name: 'StudentA'})
 .populate('classes', {where: {type: ['type1', 'type2']}})
 .exec(...)

В дополнение к where вы также можете использовать skip, limit и sort во втором аргументе populate.

Имейте в виду, что это все еще (на момент публикации) в бета-версии, поэтому, если вы обнаружите какие-либо проблемы, из-за которых кажется, что это работает неправильно, опубликуйте их на форум по проблемам Waterline на GitHub.

person sgress454    schedule 07.04.2014
comment
Спасибо @Scott, но можно ли также отфильтровать базу пользователей по соответствующим значениям таблицы? - person ginad; 08.04.2014
comment
Нет. Лучше всего сделать Class.find({type: ['type1', 'type2']}).populate('users'), затем прокрутить результат и объединить массивы пользователей вместе. - person sgress454; 09.04.2014