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