Как определить отношения внешнего ключа в парусах с помощью mysql

Я действительно новичок в парусах, и вся документация, связанная с ORM, настолько проста, насколько это возможно, поэтому я изо всех сил пытаюсь понять, как установить отношения в моих моделях. Вот мои таблицы и модели: http://pastebin.com/yt8jFTkk

Теперь я пытаюсь сделать что-то вроде:

AccountApplication.findOne({
    token: 'someTokenHere', 
    application.type: 'foo', 
    application.serviceProvider: 'bar'
}).populate('application')
.populate('account').exec(...)...

Я бы согласился на это и вручную проверил ожидаемый тип приложения и поставщика услуг, поскольку перекрытие токенов кажется маловероятным, и использовал бы find() вместо findOne():

AccountApplication.findOne({
    token: 'someTokenHere'
}).populate('application')
.populate('account').exec(...)...

Я думаю, что немного не понимаю, как паруса/ватерлиния должны знать, что account_id в моей модели AccountApplication является внешним ключом для свойства учетной записи. Что мне здесь не хватает? В настоящее время populate() ни в учетной записи, ни в приложении ничего не делает, используя приведенные выше модели.


person Matthew FitzPatrick    schedule 27.09.2014    source источник


Ответы (1)


Проблема в том, что у вас есть повторяющиеся свойства account и accountId, которые означают одно и то же. Вам нужно account: { model: 'account', columnName: 'account_id', type: 'integer', required: true} и избавиться от атрибута accountId.

Важно то, что у вас есть только один атрибут для ассоциации, в которой хранятся базовые данные; вам не нужно дополнительно указывать столбец внешнего ключа. По-видимому, была ошибка, из-за которой указание columnName в ассоциации могло нарушить ассоциацию, но, похоже, она была устранена https://github.com/balderdashy/waterline/issues/362.

person leejt489    schedule 28.09.2014
comment
Спасибо, я сам наткнулся на это прошлой ночью. - person Matthew FitzPatrick; 29.09.2014
comment
Свойства account и accountId не могут существовать одновременно? Но в некоторых сценариях это действительно необходимо, как? - person Rwing; 01.03.2018
comment
@rwing, вероятно, это неудовлетворительный ответ, но, возможно, в этом случае вы можете использовать необработанный запрос к базе данных. - person seebiscuit; 03.06.2018