2014-01-28 2 views
10

Я искал высоко и низко, чтобы найти, как сделать основной подсчет (например, SELECT COUNT (что-то) из таблицы) с Bookshelf.js, но безрезультатно. Есть что-то, чего я не хватает? Или он просто используется с запросом на ручной выбор?bookshelf.js метод подсчета

Спасибо!

ответ

15

На данный момент это руководство запрос ... например:

bookshelf.knex(tableName).count('columnName').then(... 

Длинная история, почему это так, но это в основном из-за нескольких сложностей вокруг подсчетов в отношениях, я не хочу взломать половину рабочей один на там только ради иметь его там до поры до времени ... окончательное решение будет иметь:

model.query().count(column).then(... 

Но в настоящее время, что мутирует экземпляр строителя knex запроса, так не работает. Я работал над большим рефактором knex, и я хочу, чтобы это было реализовано в ближайшем будущем.

+2

Просто проверяю, если вы сделали какой-либо пр на этом? – timhaak

+0

Да, проверьте [мой ответ] (https://stackoverflow.com/a/48368312/504930) ниже. – devius

3

Вот формат, который я в настоящее время используют, чтобы сделать следующее из модели:

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) 
}); 
0
//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';

0
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"); 
}) 
1

Вот очень простое решение просто использовать Bookshelf.knex.raw ('Количество (ID) в качестве счетчика')

ReactionsDb 
    .query(function(qb) { 
     qb.groupBy('reaction_type'); 
    }) 
    .fetchAll({columns: ['reaction_type', Bookshelf.knex.raw('count(id) as count')]}); 
0

Начиная с версии 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 
}) 

Он также может быть использован в классах модели как статический метод:

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 
}) 
Смежные вопросы