如何在 Rust 中使用 sea-query 构造一个带有别名的复杂 LEFT JOIN?

问题描述 投票:0回答:1

我正在开发一个 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!()
        )
sea-orm sea-query
1个回答
0
投票

假设您已声明实体和关系如下:

#[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`
© www.soinside.com 2019 - 2024. All rights reserved.