use crate::{ DbErr, EntityTrait, Linked, QueryFilter, QueryResult, Related, Select, SelectModel, SelectorRaw, Statement, }; pub use sea_query::Value; use std::fmt::Debug; pub trait ModelTrait: Clone + Send + Debug { type Entity: EntityTrait; fn get(&self, c: ::Column) -> Value; fn set(&mut self, c: ::Column, v: Value); fn find_related(&self, _: R) -> Select where R: EntityTrait, Self::Entity: Related, { >::find_related().belongs_to(self) } fn find_linked(&self, l: L) -> Select where L: Linked, { let tbl_alias = &format!("r{}", l.link().len() - 1); l.find_linked().belongs_to_tbl_alias(self, tbl_alias) } } pub trait FromQueryResult: Sized { fn from_query_result(res: &QueryResult, pre: &str) -> Result; fn from_query_result_optional(res: &QueryResult, pre: &str) -> Result, DbErr> { Ok(Self::from_query_result(res, pre).ok()) } /// ``` /// # #[cfg(feature = "mock")] /// # use sea_orm::{error::*, tests_cfg::*, MockDatabase, Transaction, DbBackend}; /// # /// # let db = MockDatabase::new(DbBackend::Postgres) /// # .append_query_results(vec![vec![ /// # maplit::btreemap! { /// # "name" => Into::::into("Chocolate Forest"), /// # "num_of_cakes" => Into::::into(2), /// # }, /// # ]]) /// # .into_connection(); /// # /// use sea_orm::{query::*, FromQueryResult}; /// /// #[derive(Debug, PartialEq, FromQueryResult)] /// struct SelectResult { /// name: String, /// num_of_cakes: i32, /// } /// /// # let _: Result<(), DbErr> = smol::block_on(async { /// # /// let res: Vec = SelectResult::find_by_statement(Statement::from_sql_and_values( /// DbBackend::Postgres, /// r#"SELECT "name", COUNT(*) AS "num_of_cakes" FROM "cake" GROUP BY("name")"#, /// vec![], /// )) /// .all(&db) /// .await?; /// /// assert_eq!( /// res, /// vec![SelectResult { /// name: "Chocolate Forest".to_owned(), /// num_of_cakes: 2, /// },] /// ); /// # /// # Ok(()) /// # }); /// # assert_eq!( /// # db.into_transaction_log(), /// # vec![Transaction::from_sql_and_values( /// # DbBackend::Postgres, /// # r#"SELECT "name", COUNT(*) AS "num_of_cakes" FROM "cake" GROUP BY("name")"#, /// # vec![] /// # ),] /// # ); /// ``` fn find_by_statement(stmt: Statement) -> SelectorRaw> { SelectorRaw::>::from_statement(stmt) } }