web-dev-qa-db-ja.com

詳細で合計数を取得するために構成を逐次化します

ノードsequelizepostgresデータベースで作業しています。私はUIにページ分割されたレコードを読み込んでいます。今度は、ページ分割されたレコードを取得するために使用しているのと同じクエリで、合計レコード数を取得する必要があります。誰でも、同じようにサンプルのsequelize構成を提供してください。私の質問を明確にするために、予想されるサンプルのpostgresクエリを参照してください

SELECT count(*) over() as total ,name FROM students  WHERE gender='male' LIMIT 2 

前もって感謝します

9
Jamsheer

SQLの指定を避けたい場合は、 findAndCountAll を使用することもできます

19
redgeoff

Sequelizeを使用してそれを行うことはできませんが、必要なデータを取得するためのクエリと合計数を取得するためのクエリの2つの個別のクエリを使用して実行できます。

最初の1つ :

await Model.findAll({ where: { columnName: condition }});

二つ目 :

await Model.count({ where: { columnName: condition }});

最善の方法ではない可能性がある1つのクエリでそれを実行する場合(モデルに関連するメタデータではない各結果にメタデータを追加するため)、次のようにraw queryを作成できます。

await sequelize.query('select count(*) over(), name from table where condition', { model: Model });

私の説明があなたのお役に立てば幸いです:)、

ごきげんよう!

8

この目的で findAndCountAll を使用できます。

findAndCountAll-データベース内の複数の要素を検索し、データと合計数の両方を返します

次に例を示します。

const getStudents = async params => {
  const { count, rows: students } = await Student.findAndCountAll({
    where: {
      gender: 'male',
    },
    limit: DEFAULT_PAGE_SIZE,
    order: [['id', 'ASC']],
    ...params,
  });
  return { count, students };
}

これは、ES6の構造化解除演算子と拡散演算子、およびasync/await構文を使用しています。

paramsは、デフォルトの制限とオフセットを上書きするlimitおよびoffsetプロパティを持つオブジェクトです。

クエリで他のモデルをincludeする場合に備えて、 distinct: true を渡す必要がある場合があることに注意してください。

0
Yuriy Rypka