標題重寫為:使用Sequelize統計關聯表的行數
P粉792026467
2023-08-27 22:35:45
<p>使用sequelize和mySQL,我有兩個表:<code>User</code>和<code>Post</code>。 </p>
<p>兩個表之間的關係是<code>M:N</code></p>
<pre class="brush:php;toolbar:false;">db.User.belongsToMany(db.Post, { through: "Likes", as: "Liked" });
db.Post.belongsToMany(db.User, { through: "Likes", as: "Likers" });</pre>
<p>我想要的是獲取帖子的所有點讚者id和點讚者數量。 </p>
<p>我知道可以這樣取得<code>所有按讚者</code>。 </p>
<pre class="brush:php;toolbar:false;">const post = await Post.findOne({
其中: { id: postId },
attributes: ["id", "title", "imageUrl"],
include: [{
model: User,
as: "Likers",
attributes: ["id"],
through: { attributes: [] },
}]
})
// 結果
{
"id": 36,
"title": "test",
"imageUrl": "하늘이_1644886996449.jpg",
"Likers": [
{
"id": 13
},
{
"id": 16
}
]
}</pre>
<p>而且,我也知道可以這樣取得<code>按讚者數</code>。 </p>
<pre class="brush:php;toolbar:false;">const post = await Post.findOne({
其中: { id: postId },
attributes: ["id", "title", "imageUrl"],
include: [{
model: User,
as: "Likers",
attributes: [[sequelize.fn("COUNT", "id"), "likersCount"]],
}]
})
// 結果
{
"id": 36,
"title": "test",
"imageUrl": "하늘이_1644886996449.jpg",
"Likers": [
{
"likersCount": 2
}
]
}</pre>
<p>但是,我不知道如何同時取得它們兩個。
當我同時使用它們時,檢查結果。 </p>
<pre class="brush:php;toolbar:false;">{
model: User,
as: "Likers",
attributes: ["id", [sequelize.fn("COUNT", "id"), "likersCount"]],
through: { attributes: [] },
}
// 結果
"Likers": [
{
"id": 13,
"likersCount": 2
}
]</pre>
<p>它只顯示了一個讚者(id: 13)
它應該顯示另一個讚者(id: 16)。 </p>
<p>問題是什麼? </p>
它只顯示一個,因為
COUNT
是一個聚合函數,它將記錄分組以進行計數。所以要同時取得兩者的唯一方法是使用子查詢,在連接表中計算記錄的數量,同時取得M:N關係的另一端的記錄。