use welds::prelude::*;
#[derive(Debug, Clone, WeldsModel)]
#[welds(table = "Teams")]
#[welds(HasMany(players, Player, "team_id"))]
pub struct Team {
#[welds(primary_key)]
pub id: i32,
pub name: String,
}
#[derive(Debug, WeldsModel)]
#[welds(table = "Players")]
#[welds(BelongsTo(team, Team, "team_id"))]
pub struct Player {
#[welds(primary_key)]
pub id: i32,
pub team_id: i32,
pub name: String,
}
#[derive(Debug, WeldsModel)]
pub struct TeamWithPlayerCount {
pub id: i32,
pub name: String,
pub player_count: i32,
}
#[async_std::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let connection_string = "sqlite::memory:";
let client = welds::connections::connect(connection_string).await?;
let schema = include_str!("../../tests/testlib/databases/sqlite/01_create_tables.sql");
client.execute(schema, &[]).await?;
let data = include_str!("../../tests/testlib/databases/sqlite/02_add_test_data.sql");
client.execute(data, &[]).await?;
let query = Team::where_col(|team| team.name.like("L%"))
.select_all()
.left_join(
|team| team.players,
Player::all().select_count(|player| player.id, "player_count"),
)
.group_by(|team| team.id)
.order_by_asc(|team| team.name);
let collection: Vec<TeamWithPlayerCount> = query.run(&client).await?.collect_into()?;
for row in collection {
println!("Count: {:?}", row);
}
Ok(())
}