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
Concrete description of a relation between two entities: which tables
and columns participate, whether Self is the FK-owning side, and the
optional foreign-key constraint metadata.
Build one with RelationBuilder (returned by
EntityTrait::belongs_to / has_one /
has_many), or destructure one returned by a
RelationTrait::def impl when you need to customise it.
Fields§
§rel_type: RelationTypeCardinality of the relation.
from_tbl: TableRefTable at the FK-owning end of the relation.
to_tbl: TableRefTable being pointed to by the foreign key.
from_col: IdentityFK column(s) on from_tbl.
to_col: IdentityReferenced column(s) on to_tbl (usually the primary key).
is_owner: booltrue if Self is the FK-owning side (i.e. holds from_col).
skip_fk: boolSkip emitting a FOREIGN KEY constraint when this relation is used
to generate schema DDL.
on_delete: Option<ForeignKeyAction>ON DELETE action for the foreign key.
on_update: Option<ForeignKeyAction>ON UPDATE action for the foreign key.
on_condition: Option<Arc<dyn Fn(DynIden, DynIden) -> Condition>>Extra predicate to AND/OR into the join’s ON clause; see
RelationDef::on_condition.
fk_name: Option<String>Name of the foreign-key constraint to emit in DDL.
condition_type: ConditionTypeHow on_condition is combined with the
column equality predicate (All = AND, Any = OR).
Implementations§
Source§impl RelationDef
impl RelationDef
Sourcepub fn rev(self) -> Self
pub fn rev(self) -> Self
Swap the from and to ends of this relation. Useful when joining
from the FK-pointed-at side back to the FK-owning side.
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 (const: unstable) · 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
impl Eq 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 a RelationDef directly anywhere 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
Auto Trait Implementations§
impl !RefUnwindSafe for RelationDef
impl !Send for RelationDef
impl !Sync for RelationDef
impl !UnwindSafe for RelationDef
impl Freeze for RelationDef
impl Unpin for RelationDef
impl UnsafeUnpin 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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
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