Метод учета bookshelf.js
Я искал высоко и низко, чтобы найти, как выполнить базовый подсчет (например, SELECT COUNT (something) FROM table) с помощью Bookshelf.js, но безрезультатно. Есть что-то, чего я не хватает? Или он просто используется с запросом на ручной выбор?
Спасибо!
Ответы
Ответ 1
Теперь это ручной запрос... например:
bookshelf.knex(tableName).count('columnName').then(...
Длинная история о том, почему это дело, но в основном из-за нескольких сложностей, связанных с отношениями, я не хочу взламывать половину работающего там только ради того, чтобы его там на время... окончательное решение будет состоять в том, чтобы:
model.query().count(column).then(...
Но в настоящее время это мутирует экземпляр buck-запроса knex, поэтому не совсем работает. Я работал над большим рефактором knex, и я хочу, чтобы это было реализовано в ближайшем будущем.
Ответ 2
Здесь формат, который я сейчас использую, чтобы сделать следующее из модели:
var Sample = bookshelf.Model.extend({
tableName: 'example',
count: function (cb) {
bookshelf.knex('example')
.count('id')
.then(function (count) {
cb(null, count)
})
.catch(function (err) {
cb(err)
})
}
})
Теперь, чтобы подсчитать эту таблицу, просто вызовите
new Sample().count(function(err, result) {
console.log(result)
});
Ответ 3
Вот действительно простое решение, просто используйте Bookshelf.knex.raw('count (id) как count')
ReactionsDb
.query(function(qb) {
qb.groupBy('reaction_type');
})
.fetchAll({columns: ['reaction_type', Bookshelf.knex.raw('count(id) as count')]});
Ответ 4
//user.js
var db = require('./db');
var User = db.Model.extend({
tableName: 'users',
hasTimestamps: true,
});
module.exports = User;
//main.js
var User = require('./user');
User.where('pet', 'dog').count('*').then(function(count) {
console.log("Total Count : " , count);
});
В приведенном выше фрагменте кода User
есть модель, имеющая такие атрибуты, как pet
и name
.
Сгенерированный запрос будет выглядеть следующим образом: select count(*) from user where pet='dog';
Ответ 5
User.collection().query(function (qb) {
qb.join('courses', 'users.id', 'courses.user_id');
qb.groupBy('users.id');
qb.select("users.*");
qb.count('* as course_count');
qb.orderBy("course_count", "desc");
})
Ответ 6
Начиная с версии 0.8.2 вы можете просто использовать метод Collection#count()
:
User.collection().count().then(function(count) {
// count === 15
})
Это можно использовать в любой коллекции, например, в отношении модели:
User.forge({id: 1}).related('comments').count().then(function(count) {
// count === 16
})
Его также можно использовать в классах Model как статический метод:
User.count().then(function(count) {
// count === 15
})
Он также принимает имя столбца для фильтрации результатов подсчета, исключая строки, значение которых NULL
, и учитывает любые другие определенные ограничения запросов:
User.count('is_active').then(function(count) {
// count === 8
})
User.where('status', 'single').count().then(function(count) {
// count === 4
})