CHANGELOG
This commit is contained in:
parent
fbb16c73fa
commit
dd261f2a2f
66
CHANGELOG.md
66
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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user