diff --git a/examples/sqlx-mysql/src/main.rs b/examples/sqlx-mysql/src/main.rs index 055c3b29..164923e2 100644 --- a/examples/sqlx-mysql/src/main.rs +++ b/examples/sqlx-mysql/src/main.rs @@ -9,10 +9,21 @@ async fn main() { println!("{:?}", db); println!(); + println!("find all"); + println!(); + let cakes = cake::Entity::find().all(&db).await.unwrap(); for cc in cakes.iter() { println!("{:?}", cc); println!(); } + + println!("find one by primary key"); + println!(); + + let cheese = cake::Entity::find_one(&db, 1).await.unwrap(); + + println!("{:?}", cheese); + println!(); } diff --git a/src/entity/base.rs b/src/entity/base.rs index dc8af526..0c40d67d 100644 --- a/src/entity/base.rs +++ b/src/entity/base.rs @@ -1,9 +1,13 @@ -use super::{ColumnTrait, Identity, ModelTrait, RelationBuilder, RelationTrait, RelationType}; -use crate::Select; +use crate::{ + ColumnTrait, Connection, Database, Identity, ModelTrait, QueryErr, RelationBuilder, + RelationTrait, RelationType, Select, +}; +use async_trait::async_trait; use sea_query::{Expr, Iden, IntoIden, Value}; use std::fmt::Debug; pub use strum::IntoEnumIterator as Iterable; +#[async_trait] pub trait EntityTrait: Iden + Default + Debug + 'static { type Model: ModelTrait; @@ -52,39 +56,21 @@ pub trait EntityTrait: Iden + Default + Debug + 'static { Select::::new() } - /// ``` - /// use sea_orm::{ColumnTrait, EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder}; - /// - /// assert_eq!( - /// cake::Entity::find_one() - /// .build(MysqlQueryBuilder) - /// .to_string(), - /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` LIMIT 1" - /// ); - /// ``` - fn find_one() -> Select { - let mut select = Self::find(); - select.query().limit(1); - select - } - - /// ``` - /// use sea_orm::{ColumnTrait, EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder}; - /// - /// assert_eq!( - /// cake::Entity::find_one_by(11) - /// .build(MysqlQueryBuilder) - /// .to_string(), - /// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`id` = 11 LIMIT 1" - /// ); - /// ``` - fn find_one_by(v: V) -> Select + async fn find_one(db: &Database, v: V) -> Result where - V: Into, + V: Into + Send, { - let select = Self::find_one(); - let select = - select.filter(Expr::tbl(Self::default(), Self::primary_key().into_iden()).eq(v)); - select + let builder = db.get_query_builder_backend(); + let stmt = { + let mut select = Self::find(); + match Self::primary_key() { + Identity::Unary(iden) => { + select = select.filter(Expr::tbl(Self::default(), iden).eq(v)); + } + } + select.build(builder) + }; + let row = db.get_connection().query_one(stmt).await?; + Ok(Self::Model::from_query_result(row)?) } } diff --git a/src/query/select.rs b/src/query/select.rs index 2bf027cd..596d1bd9 100644 --- a/src/query/select.rs +++ b/src/query/select.rs @@ -1,4 +1,4 @@ -use crate::{EntityTrait, Identity, Iterable, RelationDef, RelationTrait, Statement}; +use crate::{EntityTrait, Identity, Iterable, RelationDef, RelationTrait, Statement, Related}; use core::fmt::Debug; use core::marker::PhantomData; pub use sea_query::JoinType; @@ -87,6 +87,16 @@ where self } + pub fn belongs_to(self, model: &R::Model) -> Self + where R: EntityTrait + Related { + // match R::primary_key() { + // Identity::Unary(iden) => { + // model.get(iden) + // } + // }; + self + } + /// ``` /// use sea_orm::{EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder}; /// @@ -217,8 +227,11 @@ mod tests { #[test] fn join_4() { + use crate::{Related, Select}; + + let find_fruit: Select = cake::Entity::find_related(); assert_eq!( - cake::Entity::find_fruit() + find_fruit .filter(cake::Column::Id.eq(11)) .build(MysqlQueryBuilder) .to_string(), diff --git a/src/tests_cfg/cake.rs b/src/tests_cfg/cake.rs index 6722e0c8..ad79779b 100644 --- a/src/tests_cfg/cake.rs +++ b/src/tests_cfg/cake.rs @@ -100,8 +100,8 @@ impl Related for Entity { } } -impl Entity { - pub fn find_fruit() -> Select { - Self::find_related() +impl Model { + pub fn find_fruit(&self) -> Select { + Entity::find_related().belongs_to::(self) } }