diff --git a/examples/sqlx-mysql/src/example_cake.rs b/examples/sqlx-mysql/src/example_cake.rs index 9438ac22..85207281 100644 --- a/examples/sqlx-mysql/src/example_cake.rs +++ b/examples/sqlx-mysql/src/example_cake.rs @@ -1,5 +1,5 @@ use sea_orm::{ - ColumnTrait, ColumnType, EntityTrait, EnumIter, Iden, IdenStatic, + ColumnTrait, ColumnType, EntityTrait, EnumIter, Iden, IdenStatic, PrimaryKeyOfModel, ModelTrait, QueryResult, Related, RelationDef, RelationTrait, Select, TypeErr, Value, PrimaryKeyTrait }; @@ -98,6 +98,15 @@ impl IdenStatic for PrimaryKey { // TODO: implement with derive macro impl PrimaryKeyTrait for PrimaryKey {} +// TODO: implement with derive macro +impl PrimaryKeyOfModel for PrimaryKey { + fn into_column(self) -> ::Column { + match self { + Self::Id => Column::Id, + } + } +} + impl RelationTrait for Relation { fn def(&self) -> RelationDef { match self { diff --git a/examples/sqlx-mysql/src/example_fruit.rs b/examples/sqlx-mysql/src/example_fruit.rs index 46a5bb9a..d994fbb2 100644 --- a/examples/sqlx-mysql/src/example_fruit.rs +++ b/examples/sqlx-mysql/src/example_fruit.rs @@ -1,5 +1,5 @@ use sea_orm::{ - ColumnTrait, ColumnType, EntityTrait, EnumIter, Iden, IdenStatic, + ColumnTrait, ColumnType, EntityTrait, EnumIter, Iden, IdenStatic, PrimaryKeyOfModel, ModelTrait, QueryResult, RelationDef, RelationTrait, TypeErr, Value, PrimaryKeyTrait }; @@ -103,6 +103,15 @@ impl IdenStatic for PrimaryKey { // TODO: implement with derive macro impl PrimaryKeyTrait for PrimaryKey {} +// TODO: implement with derive macro +impl PrimaryKeyOfModel for PrimaryKey { + fn into_column(self) -> ::Column { + match self { + Self::Id => Column::Id, + } + } +} + impl RelationTrait for Relation { fn def(&self) -> RelationDef { panic!() diff --git a/examples/sqlx-mysql/src/main.rs b/examples/sqlx-mysql/src/main.rs index 72048897..f817aacb 100644 --- a/examples/sqlx-mysql/src/main.rs +++ b/examples/sqlx-mysql/src/main.rs @@ -32,4 +32,14 @@ async fn main() { println!(); println!("{:?}", cheese); println!(); + + println!("find models belongs to"); + + let fruits = cheese.find_fruit().all(&db).await.unwrap(); + + println!(); + for ff in fruits.iter() { + println!("{:?}", ff); + println!(); + } } diff --git a/src/entity/primary_key.rs b/src/entity/primary_key.rs index 357b1314..744d7d45 100644 --- a/src/entity/primary_key.rs +++ b/src/entity/primary_key.rs @@ -1,3 +1,10 @@ -use super::IdenStatic; +use super::{ModelTrait, IdenStatic}; -pub trait PrimaryKeyTrait: IdenStatic {} \ No newline at end of file +pub trait PrimaryKeyTrait: IdenStatic {} + +pub trait PrimaryKeyOfModel +where + M: ModelTrait, +{ + fn into_column(self) -> M::Column; +} \ No newline at end of file diff --git a/src/query/select.rs b/src/query/select.rs index 596d1bd9..fea847c1 100644 --- a/src/query/select.rs +++ b/src/query/select.rs @@ -1,4 +1,4 @@ -use crate::{EntityTrait, Identity, Iterable, RelationDef, RelationTrait, Statement, Related}; +use crate::{EntityTrait, Identity, Iterable, PrimaryKeyOfModel, RelationDef, RelationTrait, Statement, Related}; use core::fmt::Debug; use core::marker::PhantomData; pub use sea_query::JoinType; @@ -88,13 +88,16 @@ where } pub fn belongs_to(self, model: &R::Model) -> Self - where R: EntityTrait + Related { - // match R::primary_key() { - // Identity::Unary(iden) => { - // model.get(iden) - // } - // }; - self + where R: EntityTrait + Related, R::PrimaryKey: PrimaryKeyOfModel { + use crate::{ColumnTrait, ModelTrait}; + + if let Some(key) = R::PrimaryKey::iter().next() { + // TODO: supporting composite primary key + let col = key.into_column(); + self.filter(col.eq(model.get(col))) + } else { + panic!("undefined primary key"); + } } /// ``` @@ -243,4 +246,25 @@ mod tests { .join(" ") ); } + + #[test] + fn join_5() { + + let cake_model = cake::Model { + id: 12, + name: "".to_owned(), + }; + + assert_eq!( + cake_model.find_fruit() + .build(MysqlQueryBuilder) + .to_string(), + [ + "SELECT `fruit`.`id`, `fruit`.`name`, `fruit`.`cake_id` FROM `fruit`", + "INNER JOIN `cake` ON `cake`.`id` = `fruit`.`cake_id`", + "WHERE `cake`.`id` = 12", + ] + .join(" ") + ); + } } diff --git a/src/tests_cfg/cake.rs b/src/tests_cfg/cake.rs index 9951a857..db96d95a 100644 --- a/src/tests_cfg/cake.rs +++ b/src/tests_cfg/cake.rs @@ -1,5 +1,5 @@ use crate::{ - ColumnTrait, ColumnType, EntityTrait, EnumIter, Iden, IdenStatic, + ColumnTrait, ColumnType, EntityTrait, EnumIter, Iden, IdenStatic, PrimaryKeyOfModel, ModelTrait, QueryResult, Related, RelationDef, RelationTrait, Select, TypeErr, Value, PrimaryKeyTrait }; @@ -98,6 +98,15 @@ impl IdenStatic for PrimaryKey { // TODO: implement with derive macro impl PrimaryKeyTrait for PrimaryKey {} +// TODO: implement with derive macro +impl PrimaryKeyOfModel for PrimaryKey { + fn into_column(self) -> ::Column { + match self { + Self::Id => Column::Id, + } + } +} + impl RelationTrait for Relation { fn def(&self) -> RelationDef { match self { diff --git a/src/tests_cfg/fruit.rs b/src/tests_cfg/fruit.rs index 93c9e4a3..e3762afd 100644 --- a/src/tests_cfg/fruit.rs +++ b/src/tests_cfg/fruit.rs @@ -1,5 +1,5 @@ use crate::{ - ColumnTrait, ColumnType, EntityTrait, EnumIter, Iden, IdenStatic, + ColumnTrait, ColumnType, EntityTrait, EnumIter, Iden, IdenStatic, PrimaryKeyOfModel, ModelTrait, QueryResult, RelationDef, RelationTrait, TypeErr, Value, PrimaryKeyTrait }; @@ -103,6 +103,15 @@ impl IdenStatic for PrimaryKey { // TODO: implement with derive macro impl PrimaryKeyTrait for PrimaryKey {} +// TODO: implement with derive macro +impl PrimaryKeyOfModel for PrimaryKey { + fn into_column(self) -> ::Column { + match self { + Self::Id => Column::Id, + } + } +} + impl RelationTrait for Relation { fn def(&self) -> RelationDef { panic!()