2013-12-05 3 views
2

Я пытаюсь получить только количество связанных элементов. Это делает то, что можно было ожидать:sequelize.js, count количество связанных элементов

var options = { 
    where: { 
    username: { like: '%' + q + '%'}}, 
    include: [Transaction] 
    }}; 

User.findAll(options).success(function (users) { 
    res.json(users); 
}); 

Но чтобы получить счет прямо сейчас у меня перебрать каждого из пользователей, принимая подсчет сделок, захватывая dataValues ​​и вручную внесение изменений в новом свойство (transactionCount) к объекту dataValues.

Я чувствую, что должен быть намного более чистый способ сделать это (возможно, используя псевдо свойства?), Но ответ ускользает от меня. Любой совет?

ответ

-1

Как насчет:

var options = { 
    where: { 
    username: { like: '%' + q + '%'}}, 
    include: [Transaction] 
    }}; 

User.findandCountAll(options).success(function (users) { 
    res.json(users); 
}); 

Подробности здесь: http://sequelizejs.com/documentation#models-finders

+1

Благодарим за ответ. findAndCountAll возвращает количество пользователей, но не содержит счет для связанных транзакций. Каждый пользователь может потенциально иметь сотни связанных транзакций, поэтому важно передавать только счет для каждого пользователя, а не всех данных транзакций. – corinna000

+0

Для этого вам нужно опуститься до чистого SQL. – dankohn

+0

Спасибо Dan. Теперь у меня есть SQL. Не могли бы вы предложить какие-либо рекомендации по обновлению модели с помощью методов setter? Я [пробовал подход в соответствии с документами] (http://sequelizejs.com/documentation#models-getters---setters), но свойства не отображаются в списке dataValues. – corinna000

-2

В случае наличия только одна Связанного модель, я был в состоянии перебрать каждый пользователь, сосчитать связанные транзакции, а затем скопировать Значения пользовательских данных в отдельный массив и отправлять их клиенту.

var values = [], 
    i; 

for (i = 0; i < users.length; i++) { 
    var user = users[i], 
     userValues = users[i].dataValues; 
    if (userValues.hasOwnProperty('username')) { 
    userValues.transactions = (!!user.transactions) ? user.transactions.length : 0; 
    values.push(userValues); 
    } 
} 

В случае необходимости рассчитывает на двух моделях Associated, я закончил с использованием сырой SQL, чтобы получить отсчеты для операций и счетов. Затем я использую нечто подобное выше, чтобы вручную добавить значения в базовую модель. Примечание: Вам нужно переименовать поля в запросе, иначе Sequelize будет интерпретировать период (.) Недружелюбным образом и назначить свойства с именами, такими как COUNT(T и id).

var query = 'SELECT A.id AS id, ' + 
    'COUNT(T.id) AS transactions, ' + 
    'COUNT(DISTINCT U.username) AS users ' + 
    'FROM Users U, Transactions T, Accounts A ' + 
    'WHERE U.accountId = A.id ' + 
    'AND T.username = U.username ' + 
    'AND U.accountId IN (' + ids.join(',') + ') ' + 
    'GROUP BY U.username'; 
Смежные вопросы