diff --git a/src/entity/base_entity.rs b/src/entity/base_entity.rs index d28ed8e3..8d143443 100644 --- a/src/entity/base_entity.rs +++ b/src/entity/base_entity.rs @@ -1,7 +1,7 @@ use crate::{ ActiveModelTrait, ColumnTrait, Delete, DeleteOne, FromQueryResult, Insert, ModelTrait, - OneOrManyActiveModel, PrimaryKeyToColumn, PrimaryKeyTrait, QueryFilter, RelationBuilder, - RelationTrait, RelationType, Select, Update, UpdateOne, + OneOrManyActiveModel, PrimaryKeyToColumn, PrimaryKeyTrait, QueryFilter, Related, + RelationBuilder, RelationTrait, RelationType, Select, Update, UpdateOne, }; use sea_query::{Iden, IntoValueTuple}; use std::fmt::Debug; @@ -35,11 +35,11 @@ pub trait EntityTrait: EntityName { RelationBuilder::new(RelationType::HasOne, Self::default(), related) } - fn has_many(related: R) -> RelationBuilder + fn has_many(_: R) -> RelationBuilder where - R: EntityTrait, + R: EntityTrait + Related, { - RelationBuilder::new(RelationType::HasMany, Self::default(), related) + RelationBuilder::from_rel_def(R::to().rev()) } /// ``` diff --git a/src/entity/relation.rs b/src/entity/relation.rs index d618ce52..6bd487d0 100644 --- a/src/entity/relation.rs +++ b/src/entity/relation.rs @@ -78,6 +78,17 @@ where } } + pub(crate) fn from_rel_def(rel: RelationDef) -> Self { + Self { + entities: PhantomData, + rel_type: rel.rel_type, + from_tbl: rel.from_tbl, + to_tbl: rel.to_tbl, + from_col: Some(rel.from_col), + to_col: Some(rel.to_col), + } + } + pub fn from(mut self, identifier: E::Column) -> Self { self.from_col = Some(identifier.into_identity()); self diff --git a/src/tests_cfg/cake.rs b/src/tests_cfg/cake.rs index bd2c4c0c..c5ba7348 100644 --- a/src/tests_cfg/cake.rs +++ b/src/tests_cfg/cake.rs @@ -52,10 +52,7 @@ impl ColumnTrait for Column { impl RelationTrait for Relation { fn def(&self) -> RelationDef { match self { - Self::Fruit => Entity::has_many(super::fruit::Entity) - .from(Column::Id) - .to(super::fruit::Column::CakeId) - .into(), + Self::Fruit => Entity::has_many(super::fruit::Entity).into(), } } } diff --git a/src/tests_cfg/fruit.rs b/src/tests_cfg/fruit.rs index 85a73081..a915e37a 100644 --- a/src/tests_cfg/fruit.rs +++ b/src/tests_cfg/fruit.rs @@ -36,7 +36,9 @@ impl PrimaryKeyTrait for PrimaryKey { } #[derive(Copy, Clone, Debug, EnumIter)] -pub enum Relation {} +pub enum Relation { + Cake, +} impl ColumnTrait for Column { type EntityName = Entity; @@ -52,7 +54,18 @@ impl ColumnTrait for Column { impl RelationTrait for Relation { fn def(&self) -> RelationDef { - panic!() + match self { + Self::Cake => Entity::has_one(super::cake::Entity) + .from(Column::CakeId) + .to(super::cake::Column::Id) + .into(), + } + } +} + +impl Related for Entity { + fn to() -> RelationDef { + Relation::Cake.def() } }