跳到主内容
Rust
文章阅读

Rust Sea-ORM 三表联查技巧

2025/12/1677 次阅读3 分钟

2个左连接,分组去重

sql语句


SELECT u.id,
       u.avatar,
       u.nick_name,
       u.username,
       GROUP_CONCAT(ur.role_id) AS role_ids,
       GROUP_CONCAT(ro.name) AS role_names
FROM users u
         LEFT JOIN user_role ur ON u.id = ur.user_id
         LEFT JOIN role ro ON ro.id = ur.role_id
GROUP BY u.id;

查询结果 image.png

rust写法


pub async fn find_user_list() -> AppResult<Vec<UserResponse>> {
    let db = get_db();
    let users = Users::find()
        .join_as(JoinType::LeftJoin,users::Relation::UserRole.def(),Alias::new("user_role"))
        .join_as(JoinType::LeftJoin,user_role::Relation::Role.def(),Alias::new("role"))
        .select_only()
        .column(users::Column::Id)
        .column(users::Column::Username)
        .column(users::Column::Avatar)
        .column(users::Column::LastLogin)
        .column(users::Column::NickName)
        .expr_as(Expr::cust("GROUP_CONCAT(user_role.role_id)"),"role_ids")
        .expr_as(Expr::cust("GROUP_CONCAT(role.name)"),"role_names")
        .group_by(users::Column::Id)
        .into_model::<UserResponse>()
        .all(db).await?;
    Ok(users)
}

测试 image.png

左连接查询

原生 sql


select * from permission per left join permission_role pr on pr.role_id == 1 group by per.id

sea-orm


///查找角色对应的权限列表
pub async fn find_permission_list_by_role_id(role_id: i32) -> AppResult<Vec<PermissionResponse>> {
    let db = get_db();
    let p = permission::Entity::find()
        .join(JoinType::LeftJoin, permission::Relation::PermissionRole.def())
        .group_by(permission::Column::Id)
        .all(db).await?;
    Ok(p.into_iter().map(|p| p.into()).collect())
}

返回顶部