Find one
This commit is contained in:
parent
6289b331a9
commit
3a59d896e4
@ -9,10 +9,21 @@ async fn main() {
|
||||
println!("{:?}", db);
|
||||
println!();
|
||||
|
||||
println!("find all");
|
||||
println!();
|
||||
|
||||
let cakes = cake::Entity::find().all(&db).await.unwrap();
|
||||
|
||||
for cc in cakes.iter() {
|
||||
println!("{:?}", cc);
|
||||
println!();
|
||||
}
|
||||
|
||||
println!("find one by primary key");
|
||||
println!();
|
||||
|
||||
let cheese = cake::Entity::find_one(&db, 1).await.unwrap();
|
||||
|
||||
println!("{:?}", cheese);
|
||||
println!();
|
||||
}
|
||||
|
@ -1,9 +1,13 @@
|
||||
use super::{ColumnTrait, Identity, ModelTrait, RelationBuilder, RelationTrait, RelationType};
|
||||
use crate::Select;
|
||||
use crate::{
|
||||
ColumnTrait, Connection, Database, Identity, ModelTrait, QueryErr, RelationBuilder,
|
||||
RelationTrait, RelationType, Select,
|
||||
};
|
||||
use async_trait::async_trait;
|
||||
use sea_query::{Expr, Iden, IntoIden, Value};
|
||||
use std::fmt::Debug;
|
||||
pub use strum::IntoEnumIterator as Iterable;
|
||||
|
||||
#[async_trait]
|
||||
pub trait EntityTrait: Iden + Default + Debug + 'static {
|
||||
type Model: ModelTrait;
|
||||
|
||||
@ -52,39 +56,21 @@ pub trait EntityTrait: Iden + Default + Debug + 'static {
|
||||
Select::<Self>::new()
|
||||
}
|
||||
|
||||
/// ```
|
||||
/// use sea_orm::{ColumnTrait, EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder};
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// cake::Entity::find_one()
|
||||
/// .build(MysqlQueryBuilder)
|
||||
/// .to_string(),
|
||||
/// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` LIMIT 1"
|
||||
/// );
|
||||
/// ```
|
||||
fn find_one() -> Select<Self> {
|
||||
let mut select = Self::find();
|
||||
select.query().limit(1);
|
||||
select
|
||||
}
|
||||
|
||||
/// ```
|
||||
/// use sea_orm::{ColumnTrait, EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder};
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// cake::Entity::find_one_by(11)
|
||||
/// .build(MysqlQueryBuilder)
|
||||
/// .to_string(),
|
||||
/// "SELECT `cake`.`id`, `cake`.`name` FROM `cake` WHERE `cake`.`id` = 11 LIMIT 1"
|
||||
/// );
|
||||
/// ```
|
||||
fn find_one_by<V>(v: V) -> Select<Self>
|
||||
async fn find_one<V>(db: &Database, v: V) -> Result<Self::Model, QueryErr>
|
||||
where
|
||||
V: Into<Value>,
|
||||
V: Into<Value> + Send,
|
||||
{
|
||||
let select = Self::find_one();
|
||||
let select =
|
||||
select.filter(Expr::tbl(Self::default(), Self::primary_key().into_iden()).eq(v));
|
||||
select
|
||||
let builder = db.get_query_builder_backend();
|
||||
let stmt = {
|
||||
let mut select = Self::find();
|
||||
match Self::primary_key() {
|
||||
Identity::Unary(iden) => {
|
||||
select = select.filter(Expr::tbl(Self::default(), iden).eq(v));
|
||||
}
|
||||
}
|
||||
select.build(builder)
|
||||
};
|
||||
let row = db.get_connection().query_one(stmt).await?;
|
||||
Ok(Self::Model::from_query_result(row)?)
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
use crate::{EntityTrait, Identity, Iterable, RelationDef, RelationTrait, Statement};
|
||||
use crate::{EntityTrait, Identity, Iterable, RelationDef, RelationTrait, Statement, Related};
|
||||
use core::fmt::Debug;
|
||||
use core::marker::PhantomData;
|
||||
pub use sea_query::JoinType;
|
||||
@ -87,6 +87,16 @@ where
|
||||
self
|
||||
}
|
||||
|
||||
pub fn belongs_to<R>(self, model: &R::Model) -> Self
|
||||
where R: EntityTrait + Related<E> {
|
||||
// match R::primary_key() {
|
||||
// Identity::Unary(iden) => {
|
||||
// model.get(iden)
|
||||
// }
|
||||
// };
|
||||
self
|
||||
}
|
||||
|
||||
/// ```
|
||||
/// use sea_orm::{EntityTrait, tests_cfg::cake, sea_query::MysqlQueryBuilder};
|
||||
///
|
||||
@ -217,8 +227,11 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn join_4() {
|
||||
use crate::{Related, Select};
|
||||
|
||||
let find_fruit: Select<fruit::Entity> = cake::Entity::find_related();
|
||||
assert_eq!(
|
||||
cake::Entity::find_fruit()
|
||||
find_fruit
|
||||
.filter(cake::Column::Id.eq(11))
|
||||
.build(MysqlQueryBuilder)
|
||||
.to_string(),
|
||||
|
@ -100,8 +100,8 @@ impl Related<super::fruit::Entity> for Entity {
|
||||
}
|
||||
}
|
||||
|
||||
impl Entity {
|
||||
pub fn find_fruit() -> Select<super::fruit::Entity> {
|
||||
Self::find_related()
|
||||
impl Model {
|
||||
pub fn find_fruit(&self) -> Select<super::fruit::Entity> {
|
||||
Entity::find_related().belongs_to::<Entity>(self)
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user