我正在开发一个 Rust 项目,我使用
sea-query
来构建 SQL 查询。我有以下 SQL 查询:
SELECT * FROM tblcomponent AS com1
LEFT JOIN tblcomponent AS com2 ON com1.intParentComponentId_fk=com2.intId_pk
LEFT JOIN tblcomponent AS com3 ON com2.intParentComponentId_fk=com3.intId_pk
LEFT JOIN tblcomponent AS com4 ON com3.intParentComponentId_fk=com4.intId_pk
LEFT JOIN tblcomponentdef AS comdef2 ON com2.intComponentDefId_fk=comdef2.intId_pk
LEFT JOIN tblcomponentdef AS comdef3 ON com3.intComponentDefId_fk=comdef3.intId_pk
LEFT JOIN tblcomponentdef AS comdef4 ON com4.intComponentDefId_fk=comdef4.intId_pk
我面临的主要挑战是使用具有不同别名(
LEFT JOIN
、tblcomponent
、com1
、com2
)的同一个表(com3
)设置多个com4
子句。
有谁知道如何在 Rust 中使用
sea-query
复制上述 SQL?
如您所见,这是一个嵌套的自连接。这就是为什么我们需要多个别名。 任何帮助将不胜感激!
看起来有点像这样
use entities::{tblcomponent,tblcomponentdef}
tblcomponent::Entity::find()
.join(
JoinType::LeftJoin,
//???
todo!()
)
假设您已声明实体和关系如下:
#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Eq)]
#[sea_orm(table_name = "tblcomponent")]
pub struct Model {
#[sea_orm(primary_key)]
pub id: i32,
pub tblcomponentdef_id: i32,
pub parent_id: i32,
}
#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {
#[sea_orm(
belongs_to = "Entity",
from = "Column::ParentId",
to = "Column::Id"
)]
Parent,
#[sea_orm(
belongs_to = "super::tblcomponentdef::Entity",
from = "Column::TblcomponentdefId",
to = "super::tblcomponentdef::Column::Id"
)]
Tblcomponentdef,
}
然后您可以使用以下代码构建联接查询:
use sea_orm::sea_query::Alias;
let com2 = Alias::new("com2");
let com3 = Alias::new("com3");
let com4 = Alias::new("com4");
let comdef2 = Alias::new("comdef2");
let comdef3 = Alias::new("comdef3");
let comdef4 = Alias::new("comdef4");
let select = tblcomponent::Entity::find()
.join_as(
JoinType::LeftJoin,
tblcomponent::Relation::Parent.def(),
com2.clone(),
)
.join_as(
JoinType::LeftJoin,
tblcomponent::Relation::Parent
.def()
.from_alias(com2.clone()),
com3.clone(),
)
.join_as(
JoinType::LeftJoin,
tblcomponent::Relation::Parent
.def()
.from_alias(com3.clone()),
com4.clone(),
)
.join_as(
JoinType::LeftJoin,
tblcomponent::Relation::Tblcomponentdef
.def()
.from_alias(com2),
comdef2,
)
.join_as(
JoinType::LeftJoin,
tblcomponent::Relation::Tblcomponentdef
.def()
.from_alias(com3),
comdef3,
)
.join_as(
JoinType::LeftJoin,
tblcomponent::Relation::Tblcomponentdef
.def()
.from_alias(com4),
comdef4,
)
.into_model::<tblcomponent::Model>();
let stmt = select.into_statement(DbBackend::MySql).to_string();
println!("{}", stmt);
生成的查询语句如下:
SELECT
`tblcomponent`.`id`, `tblcomponent`.`tblcomponentdef_id`, `tblcomponent`.`parent_id`
FROM `tblcomponent`
LEFT JOIN `tblcomponent` AS `com2` ON `tblcomponent`.`parent_id` = `com2`.`id`
LEFT JOIN `tblcomponent` AS `com3` ON `com2`.`parent_id` = `com3`.`id`
LEFT JOIN `tblcomponent` AS `com4` ON `com3`.`parent_id` = `com4`.`id`
LEFT JOIN `tblcomponentdef` AS `comdef2` ON `com2`.`tblcomponentdef_id` = `comdef2`.`id`
LEFT JOIN `tblcomponentdef` AS `comdef3` ON `com3`.`tblcomponentdef_id` = `comdef3`.`id`
LEFT JOIN `tblcomponentdef` AS `comdef4` ON `com4`.`tblcomponentdef_id` = `comdef4`.`id`