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 skip_fk: bool,
pub on_delete: Option<ForeignKeyAction>,
pub on_update: Option<ForeignKeyAction>,
pub on_condition: Option<Arc<dyn Fn(DynIden, DynIden) -> Condition>>,
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
skip_fk: boolSpecifies if the foreign key should be skipped
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<Arc<dyn Fn(DynIden, DynIden) -> Condition>>Custom join ON condition
fk_name: Option<String>The name of foreign key constraint
condition_type: ConditionTypeCondition type of join on expression
Implementations§
Source§impl RelationDef
impl RelationDef
Sourcepub fn from_alias<A>(self, alias: A) -> Selfwhere
A: IntoIden,
pub fn from_alias<A>(self, alias: A) -> Selfwhere
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::{
DbBackend,
entity::*,
query::*,
tests_cfg::{cake, cake_filling},
};
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(" ")
);Sourcepub fn on_condition<F>(self, f: F) -> Self
pub fn on_condition<F>(self, f: F) -> Self
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, ExprTrait, 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(" ")
);Sourcepub fn condition_type(self, condition_type: ConditionType) -> Self
pub fn condition_type(self, condition_type: ConditionType) -> Self
Set the condition type of join on expression
§Examples
use sea_orm::{entity::*, query::*, DbBackend, tests_cfg::{cake, cake_filling}};
use sea_query::{Expr, ExprTrait, 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§
Source§impl Clone for RelationDef
impl Clone for RelationDef
Source§fn clone(&self) -> RelationDef
fn clone(&self) -> RelationDef
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for RelationDef
impl Debug for RelationDef
Source§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,
Source§fn from(b: RelationBuilder<E, R>) -> Self
fn from(b: RelationBuilder<E, R>) -> Self
Source§impl From<RelationDef> for Condition
Idiomatically generate the join condition.
impl From<RelationDef> for Condition
Idiomatically generate the join condition.
This allows using RelationDef directly where sea_query expects an [IntoCondition].
§Examples
use sea_orm::tests_cfg::{cake, fruit};
use sea_orm::{entity::*, sea_query::*};
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""#
);Source§fn from(rel: RelationDef) -> Condition
fn from(rel: RelationDef) -> Condition
Source§impl From<RelationDef> for ForeignKeyCreateStatement
impl From<RelationDef> for ForeignKeyCreateStatement
Source§fn from(relation: RelationDef) -> Self
fn from(relation: RelationDef) -> Self
Source§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, IntoTableRef, ConditionType};
use sea_orm::{EnumIter, Iden, Identity, PrimaryKeyTrait, RelationDef, RelationTrait, RelationType};
let relation = RelationDef {
rel_type: RelationType::HasOne,
from_tbl: "foo".into_table_ref(),
to_tbl: "bar".into_table_ref(),
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()),
skip_fk: false,
condition_type: ConditionType::All,
};
let mut alter_table = TableAlterStatement::new()
.table("foo")
.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`)"
);Source§fn from(relation: RelationDef) -> Self
fn from(relation: RelationDef) -> Self
Source§impl Hash for RelationDef
impl Hash for RelationDef
Source§impl PartialEq for RelationDef
impl PartialEq for RelationDef
impl Eq for RelationDef
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoCondition for T
impl<T> IntoCondition for T
fn into_condition(self) -> Condition
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