diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 21e2bd3ee2..26614ee0a5 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -318,7 +318,7 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest] - path: [86, 249, 262, 319, 324, 352, 356, 471] + path: [86, 249, 262, 319, 324, 352, 356, 471, 693] steps: - uses: actions/checkout@v2 diff --git a/issues/693/Cargo.toml b/issues/693/Cargo.toml new file mode 100644 index 0000000000..715575fb08 --- /dev/null +++ b/issues/693/Cargo.toml @@ -0,0 +1,22 @@ +[workspace] +# A separate workspace + +[package] +name = "sea-orm-issues-693" +version = "0.1.0" +authors = ["Sebastian Pütz "] +edition = "2021" +publish = false + +[dependencies] +tokio = { version = "1.14", features = ["full"] } +anyhow = "1" +dotenv = "0.15" +futures-util = "0.3" +serde = "1" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } + +[dependencies.sea-orm] +path = "../../" # remove this line in your own project +features = ["runtime-tokio-rustls", "sqlx-mysql", "macros"] +default-features = false diff --git a/issues/693/src/container.rs b/issues/693/src/container.rs new file mode 100644 index 0000000000..33fb377db1 --- /dev/null +++ b/issues/693/src/container.rs @@ -0,0 +1,31 @@ +pub mod prelude { + pub use super::model::{ + ActiveModel as ContainerActiveModel, Column as ContainerColumn, Entity as Container, + Model as ContainerModel, PrimaryKey as ContainerPrimaryKey, Relation as ContainerRelation, + }; +} + +pub mod model { + use sea_orm::entity::prelude::*; + + #[derive(Clone, Debug, PartialEq, DeriveEntityModel)] + #[sea_orm(table_name = "container")] + pub struct Model { + #[sea_orm(primary_key, column_name = "db_id")] + pub rust_id: i32, + } + + #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] + pub enum Relation { + #[sea_orm(has_many = "crate::Content")] + Content, // 1(Container) ⇆ n(Content) + } + + impl Related for Entity { + fn to() -> RelationDef { + Relation::Content.def() + } + } + + impl ActiveModelBehavior for ActiveModel {} +} diff --git a/issues/693/src/content.rs b/issues/693/src/content.rs new file mode 100644 index 0000000000..9b3d5e968e --- /dev/null +++ b/issues/693/src/content.rs @@ -0,0 +1,36 @@ +pub mod prelude { + pub use super::model::{ + ActiveModel as ContentActiveModel, Column as ContentColumn, Entity as Content, + Model as ContentModel, PrimaryKey as ContentPrimaryKey, Relation as ContentRelation, + }; +} + +pub mod model { + use sea_orm::entity::prelude::*; + + #[derive(Clone, Debug, PartialEq, DeriveEntityModel)] + #[sea_orm(table_name = "content")] + pub struct Model { + #[sea_orm(primary_key)] + pub id: i32, + pub container_id: i32, + } + + #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] + pub enum Relation { + #[sea_orm( + belongs_to = "crate::Container", + from = "crate::ContentColumn::ContainerId", + to = "crate::ContainerColumn::RustId" + )] + Container, // 1(Container) ⇆ n(Content) + } + + impl Related for Entity { + fn to() -> RelationDef { + Relation::Container.def() + } + } + + impl ActiveModelBehavior for ActiveModel {} +} diff --git a/issues/693/src/main.rs b/issues/693/src/main.rs new file mode 100644 index 0000000000..9064482753 --- /dev/null +++ b/issues/693/src/main.rs @@ -0,0 +1,18 @@ +mod container; +mod content; + +use container::prelude::*; +use content::prelude::*; +use sea_orm::{DbBackend, EntityTrait, QueryTrait}; + +fn main() { + assert_eq!( + Container::find().find_with_related(Content).build(DbBackend::MySql).to_string(), + [ + "SELECT `container`.`db_id` AS `A_db_id`, `content`.`id` AS `B_id`, `content`.`container_id` AS `B_container_id`", + "FROM `container`", + "LEFT JOIN `content` ON `container`.`db_id` = `content`.`container_id`", + "ORDER BY `container`.`db_id` ASC", + ].join(" ") + ); +}