This commit is contained in:
Chris Tsang 2021-05-09 16:47:34 +08:00
parent 6289b331a9
commit 3a59d896e4
4 changed files with 49 additions and 39 deletions

View File

@ -9,10 +9,21 @@ async fn main() {
println!("{:?}", db); println!("{:?}", db);
println!(); println!();
println!("find all");
println!();
let cakes = cake::Entity::find().all(&db).await.unwrap(); let cakes = cake::Entity::find().all(&db).await.unwrap();
for cc in cakes.iter() { for cc in cakes.iter() {
println!("{:?}", cc); println!("{:?}", cc);
println!(); println!();
} }
println!("find one by primary key");
println!();
let cheese = cake::Entity::find_one(&db, 1).await.unwrap();
println!("{:?}", cheese);
println!();
} }

View File

@ -1,9 +1,13 @@
use super::{ColumnTrait, Identity, ModelTrait, RelationBuilder, RelationTrait, RelationType}; use crate::{
use crate::Select; ColumnTrait, Connection, Database, Identity, ModelTrait, QueryErr, RelationBuilder,
RelationTrait, RelationType, Select,
};
use async_trait::async_trait;
use sea_query::{Expr, Iden, IntoIden, Value}; use sea_query::{Expr, Iden, IntoIden, Value};
use std::fmt::Debug; use std::fmt::Debug;
pub use strum::IntoEnumIterator as Iterable; pub use strum::IntoEnumIterator as Iterable;
#[async_trait]
pub trait EntityTrait: Iden + Default + Debug + 'static { pub trait EntityTrait: Iden + Default + Debug + 'static {
type Model: ModelTrait; type Model: ModelTrait;
@ -52,39 +56,21 @@ pub trait EntityTrait: Iden + Default + Debug + 'static {
Select::<Self>::new() Select::<Self>::new()
} }
/// ``` async fn find_one<V>(db: &Database, v: V) -> Result<Self::Model, QueryErr>
/// 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<Self> {
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: V) -> Select<Self>
where where
V: Into<Value>, V: Into<Value> + Send,
{ {
let select = Self::find_one(); let builder = db.get_query_builder_backend();
let select = let stmt = {
select.filter(Expr::tbl(Self::default(), Self::primary_key().into_iden()).eq(v)); let mut select = Self::find();
select 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)?)
} }
} }

View File

@ -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::fmt::Debug;
use core::marker::PhantomData; use core::marker::PhantomData;
pub use sea_query::JoinType; pub use sea_query::JoinType;
@ -87,6 +87,16 @@ where
self self
} }
pub fn belongs_to<R>(self, model: &R::Model) -> Self
where R: EntityTrait + Related<E> {
// match R::primary_key() {
// Identity::Unary(iden) => {
// model.get(iden)
// }
// };
self
}
/// ``` /// ```
/// use sea_orm::{EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder}; /// use sea_orm::{EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder};
/// ///
@ -217,8 +227,11 @@ mod tests {
#[test] #[test]
fn join_4() { fn join_4() {
use crate::{Related, Select};
let find_fruit: Select<fruit::Entity> = cake::Entity::find_related();
assert_eq!( assert_eq!(
cake::Entity::find_fruit() find_fruit
.filter(cake::Column::Id.eq(11)) .filter(cake::Column::Id.eq(11))
.build(MysqlQueryBuilder) .build(MysqlQueryBuilder)
.to_string(), .to_string(),

View File

@ -100,8 +100,8 @@ impl Related<super::fruit::Entity> for Entity {
} }
} }
impl Entity { impl Model {
pub fn find_fruit() -> Select<super::fruit::Entity> { pub fn find_fruit(&self) -> Select<super::fruit::Entity> {
Self::find_related() Entity::find_related().belongs_to::<Entity>(self)
} }
} }