Add RelationDef::from_alias() (#2146)

* Add `RelationDef::from_alias()`

* Fix code formatting

* Fix code formatting again
This commit is contained in:
Dmitrii Aleksandrov 2024-03-11 03:55:22 +04:00 committed by GitHub
parent be7ec5b64b
commit 159c53e65f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1,7 +1,7 @@
use crate::{unpack_table_ref, EntityTrait, Identity, IdentityOf, Iterable, QuerySelect, Select};
use core::marker::PhantomData;
use sea_query::{
Alias, Condition, ConditionType, DynIden, ForeignKeyCreateStatement, JoinType, SeaRc,
Alias, Condition, ConditionType, DynIden, ForeignKeyCreateStatement, IntoIden, JoinType, SeaRc,
TableForeignKey, TableRef,
};
use std::fmt::Debug;
@ -167,6 +167,56 @@ impl RelationDef {
}
}
/// Express the relation from a table alias.
///
/// This is a shorter and more discoverable equivalent to modifying `from_tbl` field by hand.
///
/// # Examples
///
/// Here's a short synthetic example.
/// In real life you'd use aliases when the table name comes up twice and you need to disambiguate,
/// e.g. https://github.com/SeaQL/sea-orm/discussions/2133
///
/// ```
/// use sea_orm::{
/// entity::*,
/// query::*,
/// tests_cfg::{cake, cake_filling},
/// DbBackend,
/// };
/// use sea_query::Alias;
///
/// let cf = Alias::new("cf");
///
/// assert_eq!(
/// cake::Entity::find()
/// .join_as(
/// JoinType::LeftJoin,
/// cake_filling::Relation::Cake.def().rev(),
/// cf.clone()
/// )
/// .join(
/// JoinType::LeftJoin,
/// cake_filling::Relation::Filling.def().from_alias(cf)
/// )
/// .build(DbBackend::MySql)
/// .to_string(),
/// [
/// "SELECT `cake`.`id`, `cake`.`name` FROM `cake`",
/// "LEFT JOIN `cake_filling` AS `cf` ON `cake`.`id` = `cf`.`cake_id`",
/// "LEFT JOIN `filling` ON `cf`.`filling_id` = `filling`.`id`",
/// ]
/// .join(" ")
/// );
/// ```
pub fn from_alias<A>(mut self, alias: A) -> Self
where
A: IntoIden,
{
self.from_tbl = self.from_tbl.alias(alias);
self
}
/// Set custom join ON condition.
///
/// This method takes a closure with two parameters