Struct RelationDef
pub struct RelationDef {
pub rel_type: RelationType,
pub from_tbl: TableRef,
pub to_tbl: TableRef,
pub from_col: Identity,
pub to_col: Identity,
pub is_owner: bool,
pub on_delete: Option<ForeignKeyAction>,
pub on_update: Option<ForeignKeyAction>,
pub on_condition: Option<Box<dyn Fn(SeaRc<dyn Iden>, SeaRc<dyn Iden>) -> Condition + Send + Sync>>,
pub fk_name: Option<String>,
pub condition_type: ConditionType,
}Expand description
Defines a relationship
Fields§
§rel_type: RelationTypeThe type of relationship defined in RelationType
from_tbl: TableRefReference from another Entity
to_tbl: TableRefReference to another ENtity
from_col: IdentityReference to from a Column
to_col: IdentityReference to another column
is_owner: boolDefines the owner of the Relation
on_delete: Option<ForeignKeyAction>Defines an operation to be performed on a Foreign Key when a
DELETE Operation is performed
on_update: Option<ForeignKeyAction>Defines an operation to be performed on a Foreign Key when a
UPDATE Operation is performed
on_condition: Option<Box<dyn Fn(SeaRc<dyn Iden>, SeaRc<dyn Iden>) -> Condition + Send + Sync>>Custom join ON condition
fk_name: Option<String>The name of foreign key constraint
condition_type: ConditionTypeCondition type of join on expression
Implementations§
§impl RelationDef
impl RelationDef
pub fn rev(self) -> RelationDef
pub fn rev(self) -> RelationDef
Reverse this relation (swap from and to)
pub fn from_alias<A>(self, alias: A) -> RelationDefwhere
A: IntoIden,
pub fn from_alias<A>(self, alias: A) -> RelationDefwhere
A: IntoIden,
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 = "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 on_condition<F>(self, f: F) -> RelationDef
pub fn on_condition<F>(self, f: F) -> RelationDef
Set custom join ON condition.
This method takes a closure with two parameters denoting the left-hand side and right-hand side table in the join expression.
This replaces the current condition if it is already set.
§Examples
use sea_orm::{entity::*, query::*, DbBackend, tests_cfg::{cake, cake_filling}};
use sea_query::{Expr, IntoCondition};
assert_eq!(
cake::Entity::find()
.join(
JoinType::LeftJoin,
cake_filling::Relation::Cake
.def()
.rev()
.on_condition(|_left, right| {
Expr::col((right, cake_filling::Column::CakeId))
.gt(10i32)
.into_condition()
})
)
.build(DbBackend::MySql)
.to_string(),
[
"SELECT `cake`.`id`, `cake`.`name` FROM `cake`",
"LEFT JOIN `cake_filling` ON `cake`.`id` = `cake_filling`.`cake_id` AND `cake_filling`.`cake_id` > 10",
]
.join(" ")
);pub fn condition_type(self, condition_type: ConditionType) -> RelationDef
pub fn condition_type(self, condition_type: ConditionType) -> RelationDef
Set the condition type of join on expression
§Examples
use sea_orm::{entity::*, query::*, DbBackend, tests_cfg::{cake, cake_filling}};
use sea_query::{Expr, IntoCondition, ConditionType};
assert_eq!(
cake::Entity::find()
.join(
JoinType::LeftJoin,
cake_filling::Relation::Cake
.def()
.rev()
.condition_type(ConditionType::Any)
.on_condition(|_left, right| {
Expr::col((right, cake_filling::Column::CakeId))
.gt(10i32)
.into_condition()
})
)
.build(DbBackend::MySql)
.to_string(),
[
"SELECT `cake`.`id`, `cake`.`name` FROM `cake`",
"LEFT JOIN `cake_filling` ON `cake`.`id` = `cake_filling`.`cake_id` OR `cake_filling`.`cake_id` > 10",
]
.join(" ")
);Trait Implementations§
§impl Debug for RelationDef
impl Debug for RelationDef
§impl<E, R> From<RelationBuilder<E, R>> for RelationDefwhere
E: EntityTrait,
R: EntityTrait,
impl<E, R> From<RelationBuilder<E, R>> for RelationDefwhere
E: EntityTrait,
R: EntityTrait,
§fn from(b: RelationBuilder<E, R>) -> RelationDef
fn from(b: RelationBuilder<E, R>) -> RelationDef
§impl From<RelationDef> for ForeignKeyCreateStatement
impl From<RelationDef> for ForeignKeyCreateStatement
§fn from(relation: RelationDef) -> ForeignKeyCreateStatement
fn from(relation: RelationDef) -> ForeignKeyCreateStatement
§impl From<RelationDef> for TableForeignKey
Creates a column definition for example to update a table.
impl From<RelationDef> for TableForeignKey
Creates a column definition for example to update a table.
use sea_query::{Alias, IntoIden, MysqlQueryBuilder, TableAlterStatement, TableRef, ConditionType};
use sea_orm::{EnumIter, Iden, Identity, PrimaryKeyTrait, RelationDef, RelationTrait, RelationType};
let relation = RelationDef {
rel_type: RelationType::HasOne,
from_tbl: TableRef::Table("foo".into_iden()),
to_tbl: TableRef::Table("bar".into_iden()),
from_col: Identity::Unary("bar_id".into_iden()),
to_col: Identity::Unary("bar_id".into_iden()),
is_owner: false,
on_delete: None,
on_update: None,
on_condition: None,
fk_name: Some("foo-bar".to_string()),
condition_type: ConditionType::All,
};
let mut alter_table = TableAlterStatement::new()
.table(TableRef::Table("foo".into_iden()))
.add_foreign_key(&mut relation.into()).take();
assert_eq!(
alter_table.to_string(MysqlQueryBuilder::default()),
"ALTER TABLE `foo` ADD CONSTRAINT `foo-bar` FOREIGN KEY (`bar_id`) REFERENCES `bar` (`bar_id`)"
);§fn from(relation: RelationDef) -> TableForeignKey
fn from(relation: RelationDef) -> TableForeignKey
§impl IntoCondition for RelationDef
Idiomatically generate the join condition.
impl IntoCondition for RelationDef
Idiomatically generate the join condition.
This allows using RelationDef directly where sea_query expects an IntoCondition.
§Examples
use sea_orm::sea_query::*;
use sea_orm::tests_cfg::{cake, fruit};
use sea_orm::*;
let query = Query::select()
.from(fruit::Entity)
.inner_join(cake::Entity, fruit::Relation::Cake.def())
.to_owned();
assert_eq!(
query.to_string(MysqlQueryBuilder),
r#"SELECT FROM `fruit` INNER JOIN `cake` ON `fruit`.`cake_id` = `cake`.`id`"#
);
assert_eq!(
query.to_string(PostgresQueryBuilder),
r#"SELECT FROM "fruit" INNER JOIN "cake" ON "fruit"."cake_id" = "cake"."id""#
);
assert_eq!(
query.to_string(SqliteQueryBuilder),
r#"SELECT FROM "fruit" INNER JOIN "cake" ON "fruit"."cake_id" = "cake"."id""#
);fn into_condition(self) -> Condition
Auto Trait Implementations§
impl Freeze for RelationDef
impl !RefUnwindSafe for RelationDef
impl Send for RelationDef
impl Sync for RelationDef
impl Unpin for RelationDef
impl !UnwindSafe for RelationDef
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more