タイトルは次のように書き換えられます: Sequelize を使用して関連テーブルの行数をカウントする
P粉792026467
2023-08-27 22:35:45
<p>Sequelize と mySQL を使用して、<code>User</code> と <code>Post</code> という 2 つのテーブルがあります。 </p>
<p>2 つのテーブル間の関係は <code>M:N</code></p> です。
<pre class="brush:php;toolbar:false;">db.User.belongsToMany(db.Post, { through: "いいね", as: "いいね" });
db.Post.belongsToMany(db.User, { through: 「いいね!」、as: 「いいね!」 });</pre>
<p>私が望むのは、投稿のすべての「いいね!」の ID と「いいね!」の数を取得することです。 </p>
<p>このようにして <code>すべてのいいね者</code> を取得できることはわかっています。 </p>
<pre class="brush:php;toolbar:false;">const post = await Post.findOne({
ここで: { id: postId }、
属性: ["id"、"title"、"imageUrl"]、
含む: [{
モデル: ユーザー、
として: 「いいね!」、
属性: ["id"]、
経由: { 属性: [] }、
}]
})
// 結果
{
「id」: 36、
"タイトル": "テスト",
"imageUrl": "하늘이_1644886996449.jpg",
「いいね!」: [
{
「ID」: 13
}、
{
「ID」: 16
}
]
}</pre>
<p>また、この方法で <code>いいね数</code> を取得できることもわかりました。 </p>
<pre class="brush:php;toolbar:false;">const post = await Post.findOne({
ここで: { id: postId }、
属性: ["id"、"title"、"imageUrl"]、
含む: [{
モデル: ユーザー、
として: 「いいね!」、
属性: [[sequelize.fn("COUNT", "id"), "likersCount"]],
}]
})
// 結果
{
「id」: 36、
"タイトル": "テスト",
"imageUrl": "하늘이_1644886996449.jpg",
「いいね!」: [
{
「いいね数」: 2
}
]
}</pre>
<p>しかし、両方を同時に取得する方法がわかりません。
両方を使用したときの結果を確認してください。 </p>
<pre class="brush:php;toolbar:false;">{
モデル: ユーザー、
として: 「いいね!」、
属性: ["id", [sequelize.fn("COUNT", "id"), "likersCount"]],
経由: { 属性: [] }、
}
// 結果
「いいね!」: [
{
「id」: 13、
「いいね数」: 2
}
]</pre>
<p>いいね!をした人は 1 人だけ表示されます (id: 13)
別のいいね! (id: 16) が表示されるはずです。 </p>
<p>何が問題ですか? </p>
COUNT
はカウントするためにレコードをグループ化する集計関数であるため、1 つだけが表示されます。したがって、両方を取得する唯一の方法は、サブクエリを使用し、結合テーブル内のレコード数を数え、同時に M:N 関係の反対側にあるレコードを取得することです。