Метод учета 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
})