From dd261f2a2f709a31e47657b46c9e554dcaa03452 Mon Sep 17 00:00:00 2001 From: Billy Chan Date: Thu, 13 Apr 2023 11:48:39 +0800 Subject: [PATCH] CHANGELOG --- CHANGELOG.md | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5db894f5..d5dbb812 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -51,6 +51,72 @@ impl MigratorTrait for Migrator { } } ``` +* Added option to construct chained AND / OR join on condition https://github.com/SeaQL/sea-orm/pull/1433 +```rs +use sea_orm::entity::prelude::*; + +#[derive(Clone, Debug, PartialEq, Eq, DeriveEntityModel)] +#[sea_orm(table_name = "cake")] +pub struct Model { + #[sea_orm(primary_key)] + pub id: i32, + #[sea_orm(column_name = "name", enum_name = "Name")] + pub name: String, +} + +#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)] +pub enum Relation { + // By default, it's + // `JOIN `fruit` ON `cake`.`id` = `fruit`.`cake_id` AND `fruit`.`name` LIKE '%tropical%'` + #[sea_orm( + has_many = "super::fruit::Entity", + on_condition = r#"super::fruit::Column::Name.like("%tropical%")"# + )] + TropicalFruit, + // Or specify `condition_type = "any"` to override it, + // `JOIN `fruit` ON `cake`.`id` = `fruit`.`cake_id` OR `fruit`.`name` LIKE '%tropical%'` + #[sea_orm( + has_many = "super::fruit::Entity", + on_condition = r#"super::fruit::Column::Name.like("%tropical%")"# + condition_type = "any", + )] + OrTropicalFruit, +} + +impl ActiveModelBehavior for ActiveModel {} +``` +You can also override it in custom join. +```rs +assert_eq!( + cake::Entity::find() + .column_as( + Expr::col((Alias::new("cake_filling_alias"), cake_filling::Column::CakeId)), + "cake_filling_cake_id" + ) + .join(JoinType::LeftJoin, cake::Relation::OrTropicalFruit.def()) + .join_as_rev( + JoinType::LeftJoin, + cake_filling::Relation::Cake + .def() + // chained AND / OR join on condition + .condition_type(ConditionType::Any) + .on_condition(|left, _right| { + Expr::col((left, cake_filling::Column::CakeId)) + .gt(10) + .into_condition() + }), + Alias::new("cake_filling_alias") + ) + .build(DbBackend::MySql) + .to_string(), + [ + "SELECT `cake`.`id`, `cake`.`name`, `cake_filling_alias`.`cake_id` AS `cake_filling_cake_id` FROM `cake`", + "LEFT JOIN `fruit` ON `cake`.`id` = `fruit`.`cake_id` OR `fruit`.`name` LIKE '%tropical%'", + "LEFT JOIN `cake_filling` AS `cake_filling_alias` ON `cake_filling_alias`.`cake_id` = `cake`.`id` OR `cake_filling_alias`.`cake_id` > 10", + ] + .join(" ") +); +``` ### Enhancements